Java Selenium Webdriver-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"

通常出现在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" 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();
}