我收到一个错误:
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/