InternetExplorer html 属性更改

InternetExplorer html attribute change

源网页包含带有 aria-expanded='false'aria-activedescendant="Listbox_18--item-0"

的输入元素

当我将此属性更改为 'true'(以编程方式)时,它确实会在打开的 IE 上展开。也能够改变 'Listbox_18--item-3'.

但是更改后我无法触发事件。 下面是我的 VBA 代码。

IE.Document.body.getElementsByTagName("input")(0).Focus
Debug.Print IE.Document.body.getElementsByTagName("input")(0).setAttribute("aria-expanded", "true")
Debug.Print IE.Document.body.getElementsByTagName("input")(0).setAttribute("aria-activedescendant", "Listbox_18--item-3")
Debug.Print IE.Document.body.getElementsByTagName("input")(0).setAttribute("aria-expanded", "false")

好的,这就是页面上发生的事情。

您正在处理 DOM 中的元素,这些元素使用 javascript 来侦听事件然后触发函数,然后最终调用 AJAX 函数来 return无需重新加载数据到网页。

这意味着您不能只设置属性。由于设置属性的行为不会在网络应用程序的变量中注册事件/值。

所以尝试这样的事情,你将模拟页面上的操作以生成 AJAX 响应,特别是因为 SW 的网站正在使用生成的 QSI id thingy,来指定什么该页面的选择是。

所以页面上的工作流程是:页面加载,元素上设置事件,脚本资源持有函数。用户单击该元素,触发事件,记录选择值,脚本资源创建随机 ID,随机 ID 是 ajax http 请求的输入,然后它是 return 价格值来自匹配的 ID。

我在 DevTools 的控制台中做了类似的事情,它模拟了用户点击该项目。现在您看到页面执行 Ajax 请求并且 return 是价格。

document.querySelectorAll('#Listbox_10--item-3 > button')[0].click();

在像 puppeteer 这样更高级的东西中,你实际上可以设置请求拦截来在页面上查找那个请求,来自 ajax,但在 VBA 中,你将拥有等待加载,并查找要更新的页面 HTML。

现在,如果您有办法捕获 ID,然后将其作为参数发送到服务器,就像您在 DevTools 中看到的那样——您可以使用 MS XML HTTP 发送它并获得很好的效果 JSON响应。