繁体   English   中英

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

[英]Cannot read property 'click' of undefined while using Java Script Executor in Selenium

我收到一个错误:

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>

我的硒脚本如下

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 树中完全呈现并且该元素仍处于未定义状态。


细节

正如您提到的“Java Script 在控制台中工作” ,这意味着JavaScript是完美的。 主要问题是该元素未在HTML DOM 中完全呈现。


解决方案

作为解决方案,您需要为visibilityOfAllElementsLocatedBy()引入WebDriverWait ,并且您可以使用以下任一定位器策略

  • 使用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();");

最佳实践

但是,根据单击元素的最佳实践,您需要为element_to_be_clickable()引入WebDriverWait ,您可以使用以下任一定位器策略

  • 使用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

这是将元素传递给 JSExecutor 的错误方法,您需要将它与 FindElement 调用结合起来。 在您的情况下,脚本可能会在找到元素之前执行,从而导致“未定义”错误。

// find the element
var element = new WebDriverWait(driver, 20).until(ExpectedConditions.ElementToBeClickable(By.xpath("//*[@class='button button--new-resource']")));

// execute the click on the element you have found
((JavascriptExecutor)driver).ExecuteScript("arguments[0].click();", element);

问题是在引号中

js.executeScript("document.getElementsByClassName('button button--new-resource')[0].click();");

应该做这份工作

如果只有一个按钮

<a class="button button--new-resource" href="/admin/certificate_types/new">

使用document.getElementByClassName并且不使用索引:

js.executeScript("document.getElementByClassName('button button--new-resource').click();");

你的定位器是错误的,它是一个多类元素,使用 '.' 而不是空间

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

为什么要使用js executor? 尝试

WebElement element = driver.findElement(By.className(CLASS_NAME));
element.click();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM