36

我在 Selenium WebDriver 中的测试有问题。Click当程序尝试单击按钮时,该事件并不总是有效。在一项测试中一切正常,在其他测试中则不然。

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

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

下面是找到并点击按钮的源代码:

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

9 回答 9

28

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

竞争条件导致了问题:

  1. HTML 内容在禁用按钮的情况下呈现。
  2. selenium web 驱动程序脚本在触发 javascript onload事件之前执行(或完成执行)。所以button.click会发生在禁用的元素上。什么都不会发生。
  3. 然后 javascript onload 事件将触发(或完成执行)并且 javascript 将启用该按钮。
  4. 我查看了该页面,无法弄清楚为什么我的代码不起作用,因为该按钮在检查时似乎已启用,并且如果我手动单击该按钮,它就起作用了。

一旦我发现这是一个时间问题,我在这里找到了解决方案:如何让 Selenium Web Driver 等待一个元素可以访问,而不仅仅是存在?

用 Ruby 解释解决方案:

//This will not return the button until it is enabled.
button = driver.find_element(:xpath,  "//button[@id='myButtonId' and not(@disabled)]")
button.click
于 2013-02-03T10:30:38.810 回答
25

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

WebElement element = driver.findElement(By.id("something"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
于 2012-08-28T13:23:28.527 回答
5

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

于 2018-03-14T13:01:26.137 回答
3

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

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

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();
于 2014-04-02T14:02:33.023 回答
3

试试下面的代码有时你故意将注意力转移到你的元素上

WebElement element = driver.findElement("yourElement");
        Actions builder = new Actions(driver);
        builder.moveToElement(element).click(element);
        builder.perform();
于 2017-12-01T06:36:00.850 回答
1

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

下面是结构与我的情况类似的部分代码:

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

===结果是应该找到并单击 Web 元素,但切换到 UI,没有发生任何事情,也没有引发错误(未找到元素,元素未准备好单击,元素禁用等)。

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

问题是一个轻微的 xpath 语法问题,来自 Firefox 的萤火虫根本没有报告,实际上它找到了链接。

我像这样更改了大括号顺序:.//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,尝试查找语法问题,找到访问元素的不同方法。

于 2013-07-30T19:37:28.387 回答
0

查看您的 xpath,您尚未确定按钮,而是指向其中存在按钮的 span 标签。Selenium 点击 span 而不是按钮。这就是 click() 不起作用的原因。请使用 ID 或名称(如果可用)或更改 xpath 以包含按钮标签。如果您可以发布 html,那么创建 xpath 将很容易。click() 对我来说效果很好,我在一个项目中使用这种方法已经一年多了,而且每次都能正常工作......

于 2013-07-31T01:11:08.763 回答
0

您可以尝试使用 JavaScriptExecutor 或 Action 类。

//JSExecutor
WebElement element = driver.findElement(By.xpath("xpathofyourelement"));
JavascriptExecutor jsExecutor = (JavascriptExecutor)driver;
jsExecutor.executeScript("arguments[0].scrollIntoView();", element);
jsExecutor.executeScript("arguments[0].click();", element);

//Action Class
WebElement element = driver.findElement(By.xpath("xpathofyourelement"));
Actions builder = new Actions(driver);
builder.moveToElement(element).click(element);
builder.perform();

干杯..!!

于 2021-11-30T13:07:24.640 回答
-2

造成这种情况的一个可能原因是click()方法无法click在每个元素上分派事件。

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

于 2012-08-28T13:17:45.890 回答