通过 COM 通过 Autohotkey 通过 IE 登录 twitter

twitter login trough IE via COM by Autohotkey

我想通过 COM 和 autohotkey 使用 Internet Explorer 登录 Twitter 帐户 https://twitter.com/login,但我无法设置输入字段的值,我不明白为什么。

代码

准备(睡觉而不是更复杂等待更容易阅读):

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.whosebug.com 上的搜索(使用正确的选择器)上运行良好。但在 Twitter 上它不会插入值。如果有人能帮我弄清楚原因,我将不胜感激。


备注

它可能可以通过对 "WinHttp.WinHttpRequest.5.1" 对象的 POST 请求来完成,但我对此不是很有经验,并且更愿意使用 IE 对象。

在推特登录页面的文档中,分别有两个元素匹配你的selector,而且两对(用户名和密码字段)在[=30=方面看起来基本相同]:

由于 querySelector() 只会 select DOM 顺序中的第一个匹配元素,它会 select 您不需要的输入。
要解决这个问题,您可以使用 querySelectorAll() 并通过索引访问所需的元素(出于多种原因我不推荐这样做,例如某些 IE 版本不支持它)。
我建议调整 selector 以明确 select 所需的输入。一种方法是,在 select 或路径中包含一个或多个 parents:

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

[编辑]备选方案select或:

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

为了鼓励您测试更好的方法来明确地处理输入,也许包含 form 或其他一些元素更合适。如果您选择另一个 select 或者,请告诉我,我会用您的替代方案更新此答案。