我在Selenium WebDriver中测试时遇到问题。当程序试图单击按钮时,Click
事件并不总是有效。在一次测试中,一切都很好,在其他测试中则不然。
每个测试都从一页开始。首先,用户必须从select
组件中选择一个选项,然后用户单击一个按钮。
我想知道为什么有一次一切都好,而且当我第二次运行测试时它不是?
以下是查找和点击按钮的源代码:
public void clickContinueBtn() {
webElement = driver.findElement(By.xpath("//div[@class='btn magenta_s']/a/span"));
webElement.click();
}
答案 0 :(得分:21)
我遇到了类似的问题。 click方法适用于其他页面,然后在特定页面上根本不起作用。
竞争条件导致了这个问题:
button.click
将出现在已禁用的元素上。什么都不会发生。一旦我发现这是一个时间问题,我在这里找到了解决方案: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等待解决了这个......
解决方案建议:验证您的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
事件。