在Selenium中使用Java脚本执行程序时无法读取未定义的属性“单击”

时间:2018-11-28 08:18:39

标签: javascript selenium-webdriver

在尝试使用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();");

5 个答案:

答案 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