Click()方法并不总是有效

时间:2012-08-28 13:03:27

标签: java selenium webdriver

我在Selenium WebDriver中测试时遇到问题。当程序试图单击按钮时,Click事件并不总是有效。在一次测试中,一切都很好,在其他测试中则不然。

每个测试都从一页开始。首先,用户必须从select组件中选择一个选项,然后用户单击一个按钮。

我想知道为什么有一次一切都好,而且当我第二次运行测试时它不是?

以下是查找和点击按钮的源代码:

public void clickContinueBtn() {    
    webElement = driver.findElement(By.xpath("//div[@class='btn magenta_s']/a/span"));
    webElement.click(); 
}

8 个答案:

答案 0 :(得分:21)

我遇到了类似的问题。 click方法适用于其他页面,然后在特定页面上根本不起作用。

竞争条件导致了这个问题:

  1. 在禁用按钮的情况下呈现HTML内容。
  2. 在触发javascript onload事件(或已完成执行)之前执行了selenium web驱动程序脚本。因此,button.click将出现在已禁用的元素上。什么都不会发生。
  3. 然后javascript onload事件将触发(或完成执行),javascript将启用该按钮。
  4. 我查看了页面,无法弄清楚为什么我的代码无法正常工作,因为按钮似乎在检查时启用了,如果我手动点击按钮,它就可以工作。
  5. 一旦我发现这是一个时间问题,我在这里找到了解决方案:How can I get Selenium Web Driver to wait for an element to be accessible, not just present?

    用Ruby解释解决方案:

    //This will not return the button until it is enabled.
    button = driver.find_element(:xpath,  "//button[@id='myButtonId' and not(@disabled)]")
    button.click
    

答案 1 :(得分:17)

您还可以尝试使用基于Javascript的替代方法进行点击。代码可以如下:

WebElement element = driver.findElement(By.id("something"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);

答案 2 :(得分:3)

很多时候它是因为浏览器兼容性而发生的(主要是在Firefox上)。所以尽量使用 " WebElement.sendKeys(Keys.ENTER);" 代码代替 " webElement.click(); "

答案 3 :(得分:2)

您确定没有时间问题吗?在找到元素之前创建一个断点,然后查看代码是否正常运行。如果存在计时问题,请在单击按钮之前使用显式等待。另请注意,在实际单击按钮之前,该按钮应该是可单击的(元素必须是可见的并且已启用)。

明确等待的解决方案可能如下所示:

By by = By.xpath("//div[@class='btn magenta_s']/a/span");
WebDriverWait w = new WebDriverWait(driver, timeout);
WebElement element = w.waitUntil(ExpectedConditions.elementToBeClickable(by);
element.click();

答案 4 :(得分:0)

我几天前遇到过类似的问题,我在特定情况下找到了解决方案。 ===使用Selenium Webdriver,我想点击“First Link”的链接,这将在页面上加载内容。

在我的案例结构相似的部分代码下面:

<li class="first-link">
    <a class="common-style" href="javascript:;" style="padding-left: 15px; padding-right: 15px;">First Link</a>
</li>

===结果是Webelement应该被找到并点击但是切换到UI,没有发生任何事情,也没有抛出任何错误(找不到元素,元素没有准备好点击,元素被禁用等)。

尝试了几种不同的方法来找到链接(xpath和css,没有尝试通过id,因为在我的情况下没有唯一的id),我能够访问并点击带有Selenium webdriver的元素通过css与以下值:li.first-link a。 但是,当我尝试使用以下值通过xpath访问时,这在Firefox中被“找到”,但点击无效:.//li[a/text()='First Link']

问题是一个轻微的xpath语法问题,来自Firefox的firebug完全没有报告,事实上它找到了链接。

我改变了大括号的顺序:.//li/a[text()='First Link'] 现在它按预期工作,找到并单击第一个链接,并启动加载页面的JavaScript代码。

我的发现是: *这不是计时问题,所以这不会发生,因为您尝试单击未准备好的元素。否则我们用明确的Selenium等待解决了这个......

  • 问题不在于找到了元素并且没有触发javascript。您可以尝试直接执行javascript代码并手动触发事件,看看这不起作用。
  • 此问题发生在Firefox 22上,可能适用于此浏览器的旧版本。如果这适用于IE或Chrome,我无法提供信息。问题本身就是即使在xpath上存在语法冲突,firefox也不会抛出异常,这会让你认为你的代码没有任何问题,但确实存在。
  • 这是Firefox的意外未处理行为。我发现了一个报告错误: http://code.google.com/p/selenium/issues/detail?id=4757

解决方案建议:验证您的html结构,您的xpath,尝试在语法中查找问题,找到访问该元素的不同方法。

答案 5 :(得分:0)

查看你的xpath你没有找到按钮,而是指向哪个按钮所在的span标签。 Selenium点击span而不是按钮。这就是click()不起作用的原因。如果可用,请使用ID或名称,或者更改xpath以包含按钮标记。如果你可以发布html,很容易创建xpath。 click()对我来说非常有效,我在项目中使用这种方法超过一年,并且每次都能正常工作......

答案 6 :(得分:0)

尝试下面的代码,有时你会故意将注意力转向你的元素

WebElement element = driver.findElement("yourElement");
        Actions builder = new Actions(driver);
        builder.moveToElement(element).click(element);
        builder.perform();

答案 7 :(得分:-2)

可能的原因可能是click()方法无法在每个元素上发送click事件。

因此,您可以在您尝试点击的元素上明确触发click事件。