C# WebDriver-元素不可单击
我有以下问题。我在Firefox和Chrome上运行测试。在Firefox上测试运行正常,但在Chrome SauceLabs上给出一条消息:C# WebDriver-元素不可单击,c#,google-chrome,selenium,selenium-webdriver,saucelabs,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>
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)
有什么想法吗?我假设您拥有所需的正确元素,即XPath是正确的。 以下是几种解决方法:
父元素
Submit()
而不是。单击()
OnClick
事件上执行的JavaScript
.SendKeys(Keys.Enter)
既然你也将这个问题标记为Google Chrome,我想这主要发生在ChromeDriver上。我以前的一个项目(Asp.NETMVC)也有同样的问题。我发现,当一些元素不在屏幕可见区域时,该驱动程序的不可见。请注意它们已正确加载(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)", "");
或
或
其他相关主题
更新
谈到.sendKeys()
时,我也使用了。你所需要做的只是计算一下你的测试需要点击多少个标签才能到达目标web_元素。然后只需调用。单击()
请尝试以下简单代码:
element.sendKeys(Keys.TAB);
或
或
如果你在CSS中做任何复杂的事情,Chrome可能会感到困惑(这发生在我身上),并认为你试图单击的元素被另一个元素覆盖,即使事实并非如此
解决这一问题的一种方法是通过添加z索引(您还需要添加相对或绝对定位)来帮助Chrome正确理解情况,从而明确地将正确的元素放置在另一个元素之上。对我来说,它是在创建此命令
driver.FindElementByXPath("id('gender1')").SendKeys(Keys.Space);
就我而言,我是在和无线电控制互动 我在FF上遇到了这个问题。当您的字段不在视图区域中时,会发生此问题。解决此问题的巧妙方法是缩小浏览器:
notclickablefield.SendKeys(Keys.Control+“-”+“-”)
您可能希望根据页面大小或多或少地缩小。I.
如果按钮位于页面底部,则可以使用以下代码通过JavaScript将您带到底部,从中可以执行单击:
(驱动程序作为IJavaScriptExecutor.ExecuteJavaScript(“window.scrollTo(0,document.body.scrollHeight-150)”)
同样的操作也可以通过C#和Selenium提供的Actions类来完成。
这将使您进入页面底部------>
新操作(驱动程序).SendKeys(Keys.End).Perform()
Keys.End可以用Keys.PageDown//Keys.Space切换
II.
如果要获得图元的确切位置,可以:
1.获取元素的Y位置-->var elementToClick=driver.findElement(By.{Anything}(“”))
2.执行以下JS-->(驱动程序作为IJavaScriptExecutor).ExecuteScript(string.Format(“window.scrollTo(0,{0})”,elementToClickYLocation.Location.Y))
3.单击元素-->elementToClick.Click() 我意识到这是一个非常古老的问题,但它是在今天搜索一个几乎相同的问题时提出的。在尝试了这里描述的许多修复并获得了新的异常(主要是陈旧元素和http请求超时)之后,我偶然发现了Selenium的GitHub
正如在文章中所描述的,Chrome已经超越了我的chromedriver.exe版本的能力——我的v2.30驱动程序已经知道,由于ChromeV61滚动机制的改变,点击元素时会出现问题。解决了我所有的问题
tl/dr:确保您的chromedriver版本与正在测试的Chrome版本兼容。我发现Chrome中的登录按钮无法单击,即使xpath是正确的。浏览了许多网站后,我找到了解决方案—使用.submit()而不是.click(),它工作得非常好
driver.findElement(By.xpath("//button[@id='loginBtn']")).click();
driver.findElement(By.xpath("//button[@id='loginBtn']")).submit();
是否尝试在单击之前等待元素?超时后的行为相同。1。不起作用2。不起作用:没有这样的元素:“元素不在表单中,因此无法提交。”您确定该元素存在于表单中,因为到2时,您收到了该消息?不管怎样,试试3好的,这是一个有用的答案,我会在以后的测试中检查;)谢谢直接执行.SendKeys()将比向下滚动到元素和在其上执行.Click()更快实际上这是我定制的解决方案之一-请查看我的更新答案。尝试了所有方法:滚动、滚轮等。唯一有效的方法是键盘.SendKeys({TAB});(需要多少次才能在屏幕上显示控件。)荒谬!我知道:)你有没有用IJavascriptExecutor.ExecuteScript(“点击这里的元素”)尝试过原始JS代码>
element.sendKeys(Keys.TAB);
element.sendKeys("\t")
Actions builder = new Actions(driver);
builder.keyDown(Keys.TAB).perform()
driver.FindElementByXPath("id('gender1')").SendKeys(Keys.Space);
driver.findElement(By.xpath("//button[@id='loginBtn']")).click();
driver.findElement(By.xpath("//button[@id='loginBtn']")).submit();