Java Selenium Webdriver-firefox中元素不可单击错误
通常出现在chrome驱动程序中的元素not clickable错误也出现在firefox中。错误消息显示:Java Selenium Webdriver-firefox中元素不可单击错误,java,firefox,selenium,selenium-webdriver,browser-automation,Java,Firefox,Selenium,Selenium Webdriver,Browser Automation,通常出现在chrome驱动程序中的元素not clickable错误也出现在firefox中。错误消息显示: Exception in thread "main" org.openqa.selenium.WebDriverException: Element is not clickable at point (141, 299.29998779296875). Other element would receive the click: <div class="showOnTop"
Exception in thread "main" org.openqa.selenium.WebDriverException: Element is not clickable at point (141, 299.29998779296875). Other element would receive the click: <div class="showOnTop" id="loadingPanelContainer"></div>
Command duration or timeout: 209 milliseconds
Build info: version: '2.51.0', revision: '1af067dbcaedd7d2ab9af5151fc471d363d97193', time: '2016-02-05 11:20:57'
System info: host: 'Bhaveen-ThinkPad', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'i386', os.version: '3.13.0-77-generic', java.version: '1.7.0_95'
Session ID: 08e0d738-b946-4886-a179-9659d44b717b
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=LINUX, acceptSslCerts=true, javascriptEnabled=true, cssSelectorsEnabled=true, databaseEnabled=true, browserName=firefox, handlesAlerts=true, nativeEvents=false, webStorageEnabled=true, rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true, takesScreenshot=true, version=44.0.2}]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:327)
at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:85)
at config.KeyActions.handleLeftMenu(KeyActions.java:479)
at scripts.Vital_Data_Script.setVitalData(Vital_Data_Script.java:383)
at scripts.Vital_Data_Script.executeActions(Vital_Data_Script.java:95)
at scripts.Vital_Data_Script.executeTestCase(Vital_Data_Script.java:60)
at scripts.Vital_Data_Script.main(Vital_Data_Script.java:31)
线程“main”org.openqa.selenium.WebDriverException中的异常:元素在点(141299.299987779296875)处不可单击。其他元素将收到单击:
命令持续时间或超时:209毫秒
构建信息:版本:“2.51.0”,修订版:“1AF067DBCAEDD7D2AB9AF511C471D363D97193”,时间:“2016-02-05 11:20:57”
系统信息:主机:'Bhaveen ThinkPad',ip:'127.0.1.1',os.name:'Linux',os.arch:'i386',os.version:'3.13.0-77-generic',java.version:'1.7.0_95'
会话ID:08e0d738-b946-4886-a179-9659d44b717b
驱动程序信息:org.openqa.selenium.firefox.FirefoxDriver
功能[{platform=LINUX,acceptSslCerts=true,javascriptEnabled=true,cssSelectorsEnabled=true,databaseEnabled=true,browserName=firefox,handlesAlerts=true,nativeEvents=false,webStorageEnabled=true,rotatable=false,locationContextEnabled=true,applicationCacheEnabled=true,takesScreenshot=true,version=44.0.2}]
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
位于org.openqa.selenium.remote.ErrorHandler.CreateTrowable(ErrorHandler.java:206)
位于org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
位于org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
位于org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:327)
在org.openqa.selenium.remote.RemoteWebElement.click上(RemoteWebElement.java:85)
位于config.KeyActions.handleLeftMenu(KeyActions.java:479)
在scripts.Vital\u Data\u Script.setVitalData(Vital\u Data\u Script.java:383)
at scripts.Vital\u Data\u Script.executeActions(Vital\u Data\u Script.java:95)
在scripts.Vital\u Data\u Script.executeTestCase(Vital\u Data\u Script.java:60)
位于scripts.Vital\u Data\u Script.main(Vital\u Data\u Script.java:31)
您可能应该等待元素可单击,您可以使用:
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(By.<your locator>));
WebDriverWait wait=newwebdriverwait(驱动程序,30);
等待。直到(预期条件。元素可选择);
或者有时您甚至需要将鼠标悬停在该元素上以使其可单击。您可以通过以下方式执行此操作:
String mouseOverScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseover');}";
((JavascriptExecutor) driver).executeScript(mouseOverScript,
driver.findElement(By.<your locator>));
String mouseOverScript=“if(document.createEvent){var evObj=document.createEvent('MouseEvents');evObj.initEvent('mouseover',true,false);参数[0]。dispatchEvent(evObj);}else if(document.createEventObject){arguments[0]。fireEvent('onmouseover');}”;
((JavascriptExecutor)驱动程序).executeScript(mouseOverScript,
驱动程序(由.);
完成此操作后,您可以尝试:
正常单击()函数:
driver.findElement(By.<your locator>).click();
driver.findElement(By.)。单击();
或
非本机javascript执行器:
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", driver.findElement(By.<your locator>));
JavascriptExecutor执行器=(JavascriptExecutor)驱动程序;
executor.executeScript(“参数[0]。单击();”,driver.findElement(By.));
普拉蒂克的答案是正确的。然而,我注意到最新版本的Firefox和Selenium 2.50.1并不总是能够成功地将元素滚动到视图中
如果您的问题是该元素从屏幕上滚下(结果是在标题栏下),您可以尝试将其滚回视图,如下所示:
private void scrollToElementAndClick(WebElement element) {
int yScrollPosition = element.getLocation().getY();
js.executeScript("window.scroll(0, " + yScrollPosition + ");");
element.click();
}
如果需要,还可以添加一个静态偏移量(例如,如果您有一个200px高且始终显示的页眉):
尝试使用。我希望您没有添加OR,但在中,原始答案是正确的。嗨,Ardesco,我知道使用此选项不是一个好主意。但我主要从事IE的工作,你已经知道有时候它的行为有多奇怪,与FF或Chrome相比,在那里很难让东西正常工作。这是最后一个选择,有时你必须去。我会重申我的评论,我添加到你删除的答案。通过使用JavascriptExecutor单击元素,您绕过了Selenium提供的保护,以确保您没有单击用户无法交互的内容。这将使测试通过,但这并不是所有的绿色测试。您还需要确保测试确实检查了工作情况。有些东西不适合自动化,需要手动检查。没有自动测试总比自动测试给人一种一切正常的错觉好啊对不起,不是你在另一个答案中评论的,是别人。
public static final int HEADER_OFFSET = 200;
private void scrollToElementAndClick(WebElement element) {
int yScrollPosition = element.getLocation().getY() - HEADER-OFFSET;
js.executeScript("window.scroll(0, " + yScrollPosition + ");");
element.click();
}