Java Click()方法并不总是有效的

Java Click()方法并不总是有效的,java,selenium,webdriver,Java,Selenium,Webdriver,我在Selenium WebDriver中的测试有问题。当程序尝试单击按钮时,Click事件并不总是起作用。在一个测试中,一切正常,在另一些测试中则不然 每个测试从一页开始。首先,用户必须从select组件中选择一个选项,然后用户单击按钮 我想知道为什么一次一切正常,而当我第二次运行测试时却不正常 以下是查找并单击按钮的源代码: public void clickContinueBtn() { webElement = driver.findElement(By.xpath("/

我在Selenium WebDriver中的测试有问题。当程序尝试单击按钮时,
Click
事件并不总是起作用。在一个测试中,一切正常,在另一些测试中则不然

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

我想知道为什么一次一切正常,而当我第二次运行测试时却不正常

以下是查找并单击按钮的源代码:

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

一个可能的原因可能是
click()
方法无法在每个元素上分派
click
事件


因此,您可以在尝试单击的元素上显式触发
click
事件。

您也可以尝试使用基于Javascript的替代方法进行单击。其代码如下所示:

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

我遇到了类似的问题。单击方法在其他页面上起作用,但在特定页面上根本不起作用

引发问题的竞争条件:

  • HTML内容是在禁用按钮的情况下呈现的
  • selenium web驱动程序脚本是在触发javascript事件(或完成执行)之前执行的。因此,
    按钮。单击
    将出现在禁用的元素上。什么也不会发生
  • 然后javascript onload事件将触发(或完成执行),javascript将启用该按钮
  • 我看了一下页面,不明白为什么我的代码不起作用,因为在检查时按钮似乎已启用,如果我手动单击按钮,它就起作用了
  • 一旦我发现这是一个时间问题,我在这里找到了解决方案:

    用Ruby解释解决方案:

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

    几天前我遇到了一个类似的问题,我在我的案例中找到了解决方案。 ===使用SeleniumWebDriver,我想点击“第一个链接”的链接,这样可以加载页面上的内容

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

    <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 by css访问并单击元素,其值如下:
    li.first-link a
    。 但是,当我尝试使用以下值通过xpath访问时,在Firefox中找到了该值,但单击无效:
    //li[a/text()='First Link']

    问题是一个轻微的xpath语法问题,Firefox的firebug根本没有报告,事实上它找到了链接

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

    我的发现是: *这不是时间问题,因此不会发生这种情况,因为您尝试单击未准备就绪的元素。否则,我们通过显式的Selenium等待解决了这个问题

    • 问题不在于找到了元素并且没有启动javascript。您可以尝试直接执行javascript代码并手动触发事件,然后发现这不起作用
    • 此问题发生在Firefox22上,可能适用于此浏览器的旧版本。我不能提供信息,如果这在IE或Chrome上工作。问题本身是,即使xpath firefox上存在语法冲突,也不会引发异常,这让您认为代码没有问题,但确实存在
    • 这是Firefox未处理的意外行为。我发现了一个报告的错误:

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

    查看xpath时,您没有识别按钮,而是指向按钮所在的span标记。Selenium单击span而不是按钮。这就是为什么单击()不起作用的原因。如果可用,请使用Id或名称,或者更改xpath以包括按钮标记。如果您可以发布html,那么创建xpath就很容易了。click()对我来说非常有效,我在一个项目中使用这种方法已经一年多了,每次都很好…

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

    具有显式等待的解决方案可能如下所示:

    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();
    

    尝试下面的代码有时候你会故意把注意力转移到你的元素上

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

    很多时候,这是因为浏览器的兼容性(主要是在firefox上)。所以试着使用 “WebElement.sendKeys(Keys.ENTER);” 代码而不是
    “webElement.click();”

    但当我在其他页面的组件(按钮)上调用click()事件时,它也会工作。这就是为什么。有时,
    click()。因此,请尝试显式触发click事件。对不起,“显式”是什么意思?它不起作用。当选择“选择组件”的一个选项时,浏览器窗口将关闭。在尝试了几乎所有其他选项后,为我工作,谢谢@saumil说:非常感谢这是为merelated post工作的——这真的帮助了我,该脚本在其他浏览器中工作得非常完美,但在Safari 6和Android浏览器中没有,它们的速度不够快。谢谢分享这个答案!:)如何切换do iframe并等待onl