javascript - 在 Selenium 中使用 Java Script Executor 时无法读取未定义的属性 'click'

标签 javascript java selenium selenium-webdriver webdriverwait

我收到一个错误:

Cannot read property 'click' of undefined

尝试使用 java 脚本执行器单击按钮时。我尝试了许多不同的方法来使用操作类、webdriverwait 等来单击按钮,但似乎都没有用。Java 脚本在控制台中工作,但是当我在我的代码中使用时,我无法单击按钮并出现上述错误

html dom 如下所示:

<div>
    <a class="button button--new-resource" href="/admin/certificate_types/new">
        <img src="/assets/icon-add-user-e2a98953aa1855b15304eb16415b536ee92e579ce89f429bcdd062faa855e261.svg" alt="Icon add user"> New Certificate Type
    </a>
</div>

我的selenium脚本如下

JavascriptExecutor js=(JavascriptExecutor) driver;        
js.executeScript("var x= document.getElementsByClassName('button button--new-resource')[0];"+"x.click();");

最佳答案

这个错误信息...

Cannot read property 'click' of undefined

...表示 click() 方法不能作为 WebElement 执行尚未在 DOM Tree 中完全呈现并且该元素仍处于未定义状态。


详情

正如您提到的,“Java Script is working in console” 这意味着 JavaScript 是完美的。主要问题是元素没有在 HTML DOM 中完全呈现。 .


解决方案

作为解决方案,你需要诱导你需要诱导WebDriverWait对于 visibilityOfAllElementsLocatedBy(),您可以使用以下任一 Locator Strategies :

  • 使用 cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(".button.button--new-resource")));
    ((JavascriptExecutor) driver).executeScript("var x= document.getElementsByClassName('button button--new-resource')[0];"+"x.click();");
    
  • 使用 xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//*[@class='button button--new-resource']")));
    ((JavascriptExecutor) driver).executeScript("var x= document.getElementsByClassName('button button--new-resource')[0];"+"x.click();");
    

最佳实践

但是,根据最佳实践点击您需要诱导的元素WebDriverWait对于 element_to_be_clickable(),您可以使用以下任一项 Locator Strategies :

  • 使用 CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.button.button--new-resource[href='/admin/certificate_types/new']>img[alt='Icon add user']"))).click()
    
  • 使用 XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='button button--new-resource' and @href='/admin/certificate_types/new']/img[@alt='Icon add user']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

关于javascript - 在 Selenium 中使用 Java Script Executor 时无法读取未定义的属性 'click',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53514947/

相关文章:

javascript - 在 Angular 中使用 setInterval 调用函数时无法读取未定义的属性

javascript - 使用 jquery 显示和隐藏菜单

java - 将 Apache 重定向到 Vesta CP 上的 Tomcat

python - Selenium 测试 - 无论如何都会打印所有内容

javascript - 使用Md-select时,如何在 Protractor 中下拉列表?

php - "xmlResult.Result is undefined"错误

javascript - 无法读取未定义的属性 'Symbol(Symbol.iterator)'

java - List<List<String>> 和 List<Object> 不一样吗

java - 如果数组索引没有值(value),它们会影响性能/内存使用吗

python - 如何将 Selenium Firefox 浏览器嵌入到 PyQt4 框架中