【问题标题】:JavaScript click works in console but not inside Selenium execute_scriptJavaScript click 在控制台中有效,但在 Selenium execute_script 中无效
【发布时间】:2018-12-26 05:39:10
【问题描述】:

我正在使用 Selenium 测试一个站点,其想法是从 table 中获取所有 rows,选择可见的 buttons,然后选择 click 它们。单击后会触发一个事件,并在 rows 正下方加载 AJAX 数据。

以下代码在 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's,它们显示在控制台中,但根本没有触发点击事件。有趣的是,在尝试使用 Selenium 运行代码后,从控制台运行 JavaScript 并不能正常工作。

我还尝试将这些 rows 作为 array 返回并单击 Selenium,但这只会使事情变得复杂,因为我得到了陈旧的元素异常。为了确保它正常工作,我需要在每次点击后重新获取 table rows 等。

我什至想不出这不起作用的原因。有意见吗?

【问题讨论】:

    标签: javascript python selenium


    【解决方案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 应使用 """(开始和结束)。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多