WebDriver - 元素不可点击Chrome

时间:2014-09-19 08:07:08

标签: c# google-chrome selenium selenium-webdriver saucelabs

我有以下问题。我在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();

这里有什么问题吗?

8 个答案:

答案 0 :(得分:15)

我假设您拥有所需的正确元素,即XPath是正确的。 以下是几种方法:

  1. 尝试点击parent element代替。
  2. 尝试。Submit()代替.Click()
  3. 尝试执行将在您尝试点击的元素的JavaScript事件上执行的OnClick
  4. 我一直使用第三种方式取得成功。

    另一个

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

答案 1 :(得分:7)

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

经过大量的阅读和测试后,我发现我的解决方法 只是滚动到WebElement - 所以它在屏幕的可见部分。实际上这个问题不适用于所有元素,我也没有找到更好的解决方案。

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

对于这种情况不是描述性错误,因为和我一样,我也认为这是与 Selector相关的

只是为了完整答案 - 我也遇到了与 IEDriver 相同的问题。我的实现是使用浏览器向下滚动/向上选项,只是&#34;发送屏幕&#34;问题元素在哪里。

您可以使用的简单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)", "");

其他与主题相关的useful resources are here

<强> 更新

说到.sendKeys(),我还使用了browser accessibility features。您需要做的只是计算有多少 TAB 点击您的测试需求才能到达目标web_element。然后拨打.click()

试试这个简单的代码:

element.sendKeys(Keys.TAB);

element.sendKeys("\t")

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

答案 2 :(得分:1)

我意识到这是一个非常古老的问题,但是在今天搜索一个几乎相同的问题时出现了。在尝试了这里描述的许多修复并为我的麻烦(主要是陈旧的元素和http请求超时)获得新的异常后,我在Selenium的GitHub上偶然发现了this issue

正如帖子中所描述的,Chrome已经超越了我的chromedriver.exe版本的功能 - 我的v2.30驱动程序由于Chrome v61滚动机制的更改而点击了元素已知问题。 Updating to the latest chromedriver.exe解决了我所有的问题。

tl / dr:确保您的chromedriver版本与正在测试的Chrome版本兼容。

答案 3 :(得分:0)

如果您在CSS中执行任何复杂操作,Chrome可能会感到困惑(这种情况发生在我身上),并认为您尝试单击的元素会被其他元素覆盖,即使情况并非如此。< / p>

解决此问题的一种方法是帮助Chrome通过添加z-index(您还需要添加相对或绝对定位)来正确理解这种情况,以明确地将正确的元素放在另一个上面。

答案 4 :(得分:0)

对我来说,它正在创建此命令。

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

就我而言,我正在与无线电控制进行互动。

答案 5 :(得分:0)

我在FF上遇到过这个问题。当您的字段不在视图区域时,会发生此问题。解决此问题的方法是缩小浏览器:

TheNotClickableField.SendKeys(Keys.Control +&#34; - &#34; +&#34; - &#34;);

您可能希望根据页面大小或多或少缩小。

答案 6 :(得分:0)

我遇到问题,即使xpath正确,登录按钮在chrome中也无法单击。浏览了许多站点之后,我想到了解决方案-使用 .submit()而不是.click(),它运行良好。

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

答案 7 :(得分:-1)

<强>我 如果按钮位于页面底部,则可以使用以下代码通过JavaScript从中获取可以执行单击的位置:

(作为IJavaScriptExecutor的驱动程序).ExecuteJavaScript(&#34; window.scrollTo(0,document.body.scrollHeight - 150)&#34;);

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

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

Keys.End可以使用Keys.PageDown // Keys.Space

切换

<强> II。 如果你想到达元素的确切位置,你可以:

1.获取元素的Y位置---&gt; var elementToClick = driver.findElement(By。{Anything}(&#34;&#34;));

2.执行以下JS -​​--&gt; (作为IJavaScriptExecutor的驱动程序).ExecuteScript(string.Format(&#34; window.scrollTo(0,{0})&#34 ;,elementToClickYLocation.Location.Y));

3.点击元素---&gt; elementToClick.click();