在尝试使用Java脚本执行程序单击按钮时,出现错误“无法读取未定义的属性'click'”。我尝试过使用动作类,webdriverwait等方法来单击按钮的多种方法,但似乎都无法正常工作。JavaScript在控制台中正常工作,但是当我在代码中使用时,我无法单击按钮并出现上述错误>
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();");
答案 0 :(得分:2)
此错误消息...
Cannot read property 'click' of undefined
...表示click()
方法无法执行,因为WebElement尚未在DOM Tree内完全呈现,并且元素仍处于 undefined < / strong>状态。
正如您所提到的,“ Java Script在控制台中工作” 暗示 JavaScript 是完美的。主要问题是该元素尚未在HTML DOM中完全呈现。
作为一种解决方案,您需要诱使您需要为visibilityOfAllElementsLocatedBy()
引诱WebDriverWait,并且可以使用以下任一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();");
但是,根据最佳实践,单击元素需要为element_to_be_clickable()
引出WebDriverWait,并且可以使用以下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
答案 1 :(得分:1)
问题出在引号
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();");
答案 2 :(得分:1)
这是将元素传递到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);
答案 3 :(得分:0)
您的定位器是错误的,其多类元素使用'。'。而不是空间
js.executeScript("var x= document.getElementsByClassName('button.button--new-resource')[0];"+"x.click();");
答案 4 :(得分:0)
您为什么使用js执行器?试试
realuser_user1