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 脚本正在控制台中工作”,这意味着 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 - 将 D3 函数包装在对象内不起作用。为什么?

    javascript - jQuery UI Slider - 如何在一个页面中使用多个 slider

    java - 使用 EntityManager JPA EclipseLink 更新实体

    python - 如何使用 Selenium Safari Webdriver

    python - 如何使用 Selenium 和 Python 阻止或设置 HTML5 视频以自动播放?

    javascript - 将新的排名顺序从 Pick Group Rank 选择的选项转发到 Slider

    javascript - jQuery跟踪页面内容并相应地调整大小

    java - 在Vertx中发送同步EventBus消息

    java - 网络: back propogate pressure in channel handler pipeline to slow down sender

    java - 如何在Linux上使用Selenium IDE下载文件对话框