влизане в twitter през IE чрез COM чрез Autohotkey

Искам да вляза в Twitter акаунт https://twitter.com/login с помощта на Internet Explorer чрез COM с autohotkey, но не мога да задам стойността на полетата за въвеждане и не разбирам защо.

Код

Подгответе се (спете вместо по-сложно чакане за по-лесно четене):

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 (с правилните селектори). Но в Twitter не вмъква стойностите. Наистина ще съм благодарен, ако някой може да ми помогне да разбера защо.


Забележка

Вероятно може да се направи с 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