gpt4 book ai didi

javascript - watir-webdriver - execute_script 抛出 javascript 错误

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:01 25 4
gpt4 key购买 nike

下面的 javascript 代码获取所有以“opt1”开头的 div 元素的 ID 和内部文本。我正在使用 javascript 执行此操作,因为此 div 是不可见的,并且 webdriver 不支持访问不可见元素。

下面的代码在 irb 上执行时工作正常,但在我运行整个脚本时失败并出现“JavaScript 错误”。我还在 IE 控制台上执行了 javascript 代码,以确保 javascript 正确并且没有错误。

   mn = $browser.execute_script <<-JS
var eles = window.frames[1].document.getElementsByTagName('div');
var dom = [];
for ( var i = 0; i < eles.length; i++) {
if (eles[i].id.indexOf("opt1_") === 0) {
dom.push(eles[i].id + "--" + eles[i].innerText);
}
}
return dom;
JS

谁能帮我解决这个问题。

提前致谢..

最佳答案

问题可能出在 Selenium 处理帧的方式上。看起来在尝试对框架执行任何操作时会发生 Javascript 错误 - 即错误的发生是由于:

window.frames[1].document

解决方案 - 在框架上下文中执行 Javascript

一种解决方案是在框架的上下文中运行 Javascript。

假设主页正在使用 iframe(尽管可以用 frame 做类似的事情):

<html>
<body>
<iframe src="test.htm"></iframe>
<iframe src="frame_content.htm"></iframe>
</body>
</html>

并且 frame_content.htm 有一些可见和不可见的 div:

<html>
<body>
<div>irrelevant content</div>
<div id="opt1_visible">visible content</div>
<div id="opt1_hidden" style="display:none;">hidden content</div>
</body>
</html>

然后在 Watir 中,您可以针对框架对象(而不是浏览器)执行脚本(修改为删除 window.frames[1]):

frame = browser.iframe(:index => 1) # Use .frame if the page is using frames instead
mn = frame.execute_script <<-JS
var eles = document.getElementsByTagName('div');
var dom = [];
for ( var i = 0; i < eles.length; i++) {
if (eles[i].id.indexOf("opt1_") === 0) {
dom.push(eles[i].id + "--" + eles[i].innerText);
}
}
return dom;
JS
p mn
#=> ["opt1_visible--visible content", "opt1_hidden--hidden content"]

解决方案 - 仅使用 Watir

虽然 Watir 无法对不可见元素执行操作,但您仍然可以检查它们。唯一困难的是获取文本,因为 Element#text 仅返回可见文本。解决方法是改用 Element#attribute_value

通过执行以下操作,您可以获得与 Javascript 方法相同的结果:

frame = b.iframe(:index => 1) # Use .frame if the page is using frames instead
mn = b.divs(:id => /^opt1_/).map do |div|
"#{div.id}--#{div.attribute_value('innerText')}"
end
p mn
#=> ["opt1_visible--visible content", "opt1_hidden--hidden content"]

请注意 .attribute_value('innerText') 在 IE 中有效。如果您使用的是 Firefox,则需要改为执行 .attribute_value('textContent')。我相信 Chrome 支持这两个属性。

关于javascript - watir-webdriver - execute_script 抛出 javascript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25196646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com