我正在使用Selenium来测试站点,其想法是从rows
获取所有table
,选择可见的buttons
然后click
。单击后,将触发一个事件,并使用AJAX将数据加载到rows
下。
以下代码可在Firefox控制台中完美运行。实际上,点击速度如此之快,以至于所有项目都可以一次加载(最多有10行,因此我不必费心添加一个等待事件)。
function button_visible(row) {
var opacity = row.style.opacity;
if (opacity == "" || opacity == 1) {
return true;
} else {
return false;
}
}
var table = document.querySelectorAll('div>.table');
for (x = 1; x < table.length; x++) {
row = table.item(x);
var row_buttons = row.querySelectorAll('icon-button');
for (var i = 0; i < row_buttons.length; i++) {
if (button_visible(row_buttons.item(i))) {
row_buttons.item(i).click();
}
}
}
从Selenium中运行此JavaScript不起作用:
js='function button_visible(row) {var opacity = row.style.opacity; if (opacity === "" || opacity == 1) {return true;} else {return false;}} var table = document.querySelectorAll('div>.table'); for (x = 1; x < table.length; x++) {var row = table.item(x); var row_buttons = row.querySelectorAll('icon-button'); for (var i = 0; i < row_buttons.length; i++) {if(button_visible(row_buttons.item(i))){ row_buttons.item(i).click();}}}'
driver.execute_script(js)
添加了console.log
,它们会显示在控制台中,但根本不会触发click事件。有趣的是,尝试使用Selenium运行代码后,无法从控制台运行JavaScript。
我还尝试将这些rows
作为array
返回并单击Selenium,但这会使事情变得复杂,因为我得到了过时的元素异常。为确保其正常工作,我需要在每次点击等之后重新获取table rows
。
我什至不认为为什么这行不通。有意见吗?
答案 0 :(得分:1)
尝试以下操作:
driver.execute_script("""
function button_visible(row) {
var opacity = row.style.opacity;
if (opacity == "" || opacity == 1) {
return true;
} else {
return false;
}
}
var table = document.querySelectorAll('div>.table');
for (x = 1; x < table.length; x++) {
row = table.item(x);
var row_buttons = row.querySelectorAll('icon-button');
for (var i = 0; i < row_buttons.length; i++) {
if (button_visible(row_buttons.item(i))) {
row_buttons.item(i).click();
}
}
}
""")
PS:要在Selenium(Python)中运行多行JS,应使用"""
(开始和结束)。
希望对您有帮助!