вход в твиттер через IE через COM с помощью Autohotkey

Я хочу войти в учетную запись Twitter https://twitter.com/login, используя Internet Explorer через COM с автогорячей клавишей, но я не могу установить значение полей ввода, и я не понимаю, почему.

Код

Подготовьтесь (засыпайте, а не ждите более сложного чтения):

wb := ComObjCreate("InternetExplorer.Application")
sleep 500

wb.Navigate("https://twitter.com/login")
sleep 500

wb.visible := true   ;only for debugging

Код, который ничего не делает:

wb.document.querySelector(".js-username-field").value := "Test"
wb.document.querySelector(".js-password-field").value := "TestPass"

Проблема

Этот код отлично работает на www.google.com или при поиске на www.stackoverflow.com (с правильными селекторами). Но в твиттере он не вставляет значения. Я был бы очень признателен, если бы кто-нибудь помог мне понять, почему.


Примечание

Вероятно, это можно сделать с помощью POST-запроса к объекту «WinHttp.WinHttpRequest.5.1», но я не очень разбираюсь в этом и предпочел бы работать с объектом IE.


person Schneyer    schedule 18.02.2015    source источник


Ответы (1)


В документе страницы входа в Twitter есть два элемента соответственно, которые соответствуют вашим селекторам, и обе пары (поля имени пользователя и пароля) в основном выглядят одинаково с точки зрения HTML:

введите здесь описание изображения

Поскольку querySelector() выберет только первый соответствующий элемент в порядке DOM, он выберет входные данные, которые вам не нужны.
Чтобы решить эту проблему, вы можете использовать querySelectorAll() и получить доступ к нужным элементам по индексу (что я не рекомендую для несколько причин, например, некоторые версии IE не поддерживают его).
Я предлагаю настроить селектор, чтобы явно выбирать нужные входные данные. Один из способов сделать это — включить одного или нескольких родителей в путь селектора:

wb.document.querySelector("div.clearfix .js-username-field").value := "Test"
wb.document.querySelector("div.clearfix .js-password-field").value := "TestPass"

[Изменить] Альтернативный селектор:

#page-container .js-username-field
#page-container .js-password-field

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

person MCL    schedule 18.02.2015
comment
Спасибо, очень полезно. Я использовал #page-container .js-username-field. Я думаю, что это лучше всего, потому что он использует тег id и следует логике документа. - person Schneyer; 19.02.2015