WebDriver - 元素无法点击 Chrome

12

我有一个问题。我在Firefox和Chrome上运行测试。在Firefox上测试运行正常,但在Chrome上,SauceLabs会提示以下消息:

unknown error: Element is not clickable at point (717, 657). Other
element would receive the click: <div class="col-md-9 col-sm-12"
style="margin-top:8px;">...</div> (Session info: chrome=36.0.1985.125)
(Driver info: chromedriver=2.10.267521,platform=Windows NT 6.3 x86_64)

我在两个测试中以相同的方式通过唯一的CSS选择器选择元素:

driver.FindElement(By.CssSelector("button.btn-xs:nth-child(1)")).Click();

这里有什么问题,有什么想法吗?


你尝试在点击之前等待元素了吗? - German Petrov
超时后保持相同的行为。 - Sowiarz
8个回答

18

我假设您已经拥有了所需的正确元素,即XPath是正确的。以下是一些解决方法:

  1. 尝试点击父元素
  2. 尝试使用.Submit()代替.Click()
  3. 尝试执行将在您要单击的元素的OnClick事件上执行的JavaScript

我一直成功地使用第3种方法。

另外一个方法:

  1. 对该元素执行.SendKeys(Keys.Enter)(或空格键)

  1. 不起作用
  2. 不起作用:没有这样的元素:“元素不在表单中,因此无法提交。”
- Sowiarz
你确定该元素存在于表单中吗?因为按照2的说法,你收到了那条消息。不管怎样,试一下3。 - bit

8

由于您标记了问题为Google-Chrome,我认为这主要发生在ChromeDriver上。我遇到过与之前项目(Asp.Net MVC)相同的问题。我发现,当某些元素对于此驱动程序不可见,如果它们不在screen_visible_area中,请注意它们已正确加载(HTML、CSS3、JS等)。

因此,在阅读和测试了很多后,我发现我的解决方法就是将WebElement简单地滚动到屏幕的可见部分。实际上,这个问题并非所有元素都会出现,并且我没有找到更好的解决方法。

unknown error: Element is not clickable at point (..., ...) 

这种情况下,"不具有描述性的错误"并不适用,因为和您一样,我也认为它与选择器相关。

为了完整回答 - 我在使用IEDriver时也遇到了同样的问题。我的解决方法是使用浏览器向下/向上滚动选项,并将屏幕发送到出现问题的元素所在位置。

以下是您可以使用的简单JSExecutor代码:

WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(110,350)", "");

或者

jse.executeScript("scroll(0, 250);");

或者

driver.executeScript("window.scrollBy(110,350)", "");

其他相关主题的有用资源可以在这里找到

更新

当涉及到.sendKeys()时,我也使用了浏览器可访问性功能。你只需要计算测试需要多少个TAB点击才能到达目标web_element。然后调用.click()即可。

尝试这段简单的代码:

element.sendKeys(Keys.TAB);

或者

element.sendKeys("\t")

或者

Actions builder = new Actions(driver);
builder.keyDown(Keys.TAB).perform()

好的,非常有用的答案,我将在未来的测试中进行检查;) 谢谢! - Sowiarz
直接使用 .SendKeys() 会比滚动到元素并执行 .Click() 更快。 - bit
实际上,这是我定制的解决方案之一 - 请查看我的更新答案。 - ekostadinov
尝试了所有方法:滚动、滚轮等等。唯一有效的方法是使用Keyboard.SendKeys("{TAB}");(根据需要多次按下),这太荒谬了! - starmandeluxe
我知道 :) 你尝试过使用 IJavascriptExecutor.ExecuteScript("click-elem-here"); 的原始JS吗? - ekostadinov

1
我意识到这是一个非常古老的问题,但在搜索几乎相同的问题时,它出现了。尝试了这里描述的许多修复方法后,我为自己的麻烦得到了新的异常(大多是过时的元素和http请求超时),我偶然发现了Selenium的GitHub上的this issue
如帖子所述,Chrome已经超越了我的chromedriver.exe版本的能力 - 我的v2.30驱动程序由于Chrome v61滚动机制的更改而存在点击元素的已知问题。更新到最新的chromedriver.exe解决了我所有的问题。
tl/dr:确保您的chromedriver版本与正在测试的Chrome版本兼容。

1

我遇到了一个问题,即使xpath是正确的,在Chrome中登录按钮也无法点击。在浏览了许多网站之后,我找到了解决方案 - 使用.submit()而不是.click(),它完美地解决了问题。

driver.findElement(By.xpath("//button[@id='loginBtn']")).click();
driver.findElement(By.xpath("//button[@id='loginBtn']")).submit();

0

对我来说,是创建了这个命令。

driver.FindElementByXPath("id('gender1')").SendKeys(Keys.Space);

对于我的情况,我正在与无线电控制进行交互。


0
如果您在 CSS 中进行任何复杂的操作,Chrome 可能会混淆(我遇到过这种情况)并认为您要点击的元素被另一个元素覆盖了,尽管事实并非如此。
解决此问题的一种方法是通过添加 z-index(您还需要添加相对或绝对定位)来帮助 Chrome 正确地理解情况,以明确地将正确的元素放置在其他元素之上。

0

我在FF上遇到了这个问题。当您的字段不在视图区域内时,就会出现此问题。解决此问题的巧妙方法是缩小浏览器的缩放比例:

TheNotClickableField.SendKeys(Keys.Control + "-" + "-");

根据您的页面大小,您可能需要缩小或放大缩放比例。


-1

I. 如果按钮在页面底部,可以使用以下代码通过JavaScript将您带到底部,然后执行单击操作:

(driver as IJavaScriptExecutor).ExecuteJavaScript("window.scrollTo(0,document.body.scrollHeight - 150)");

使用Selenium提供的Actions类,也可以通过C#完成相同的操作。 这将使您到达页面底部----->

new Actions(Driver).SendKeys(Keys.End).Perform();

Keys.End可以切换为Keys.PageDown // Keys.Space

II. 如果您想要到达元素的确切位置,可以:

1.获取元素的Y坐标---> var elementToClick = driver.findElement(By.{Anything}(""));

2.执行以下JS---> (driver as IJavaScriptExecutor).ExecuteScript(string.Format("window.scrollTo(0,{0})", elementToClickYLocation.Location.Y));

3.单击该元素---> elementToClick.click();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接