1

Пробую выполнять действия на сайте с помощью библиотеки AngleSharp. Остановился на эмуляции нажатия кнопки.

Часть html кода отвечающий за авторизацию на сайте.

<form action="login.php?do=login" method="post" onsubmit="md5hash(vb_login_password, vb_login_md5password, vb_login_md5password_utf, )">

<input type="hidden" name="do" value="login" /> <input type="hidden" name="url" value="/log-in.php" /> <input type="hidden" name="vb_login_md5password" /> <input type="hidden" name="vb_login_md5password_utf" /> <input type="hidden" name="s" value="" /> <input type="hidden" name="securitytoken" value="guest" />

<table cellpadding="0" cellspacing="3" border="0" align="center">

&lt;tr&gt;
  &lt;td&gt;Email&lt;br /&gt;&lt;input type="text" class="bginput" name="vb_login_username" size="50" accesskey="u" tabindex="1" /&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td&gt;Pass&lt;br /&gt;&lt;input type="password" class="bginput" name="vb_login_password" size="50" tabindex="1" /&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td align="right"&gt;
    &lt;input type="submit" class="button" value="Вход" accesskey="s" tabindex="1" /&gt;
    &lt;input type="reset" class="button" value="Сброс" accesskey="r" tabindex="1" /&gt;
  &lt;/td&gt;
&lt;/tr&gt;

</table> </form>

Начал с проверки нажатия кнопки "Сброс". Для этого заполнил поля ввода логина и пароля, и проверил заполнились ли они, да они заполнились.

Затем выполнил эмуляцию нажатия кнопки, но похоже она не сработала. Т.к потом еще раз прошелся по циклом по странице, но введенные значения логина и пароля остались, то есть нажатие на кнопку не сработало.

Что я делаю не так?

 foreach (IElement element in document.Body.QuerySelectorAll("div.panel > div > form > table > tbody > tr > td > input"))
        {
            if (element.GetAttribute("type") == "text")
            {
                element.SetAttribute("value", email);
                Console.WriteLine(element.GetAttribute("value")); // проверка, изменился ли атрибут value
            }
            else if (element.GetAttribute("type") == "password")
            {
                element.SetAttribute("value", pass);
                Console.WriteLine(element.GetAttribute("value"));
            }
            else if (element.GetAttribute("type") == "reset")
            {
                IHtmlElement div = (IHtmlElement)element;
                div.DoClick();
            }
        }
A K
  • 28,718
unnamed
  • 748
  • 1
  • 8
  • 25

1 Answers1

1

Потому что нужно делать submit form (отправку формы). Что-то в духе:

var document = browsingContext.Active.QuerySelector<IHtmlFormElement>("form#login").SubmitAsync(new
{
    do = "login",
    url = "/log-in.php",
}).Result;

Не очень удобно, что у вас форма не имеет id или класса - так что подбирайте селектор.

И проверить ваш пример не могу, так как не приведён пример сайта, а создавать код - долго, но у меня подобный код является вполне рабочим.

A K
  • 28,718
  • Получилось. Нашел свойство, которым можно получить все формы на странице (когда не указаны id) context.Active.Forms[index] и затем выбрать нужную – unnamed May 19 '18 at 19:04
  • @Heldtis Блин... Если бы спросили - я бы это вам сразу сказал, потому что у меня тоже такие случаи бывали. (И я всё же рекомендую хоть как-то прицепиться к каким-то элементам вёрстки: сегодня это первая форма на странице, а завтра - нет. Пропишите лучше первая форма внутри div.something - лучше явно упасть с грохотом, чем искать, почему так странно работает) А предыдущий ваш комментаий (удалённый) был настолько невнятный, что я не понял о чём он. Он может и не об этом был. – A K May 19 '18 at 19:09