硒元素不可见?

时间:2016-08-11 05:41:03

标签: java selenium selenium-webdriver

我在点击事件中遇到Selenium的问题

WebElement btn = driver.findElement(By.xpath("//form[@name=\"addMemberForm\"]/div[14]/div/button"));
System.out.print(btn);

打印结果

  

[[ChromeDriver:LINUX上的chrome(0f787065444f6b2cddf2c6ff5e6c056d)] - >   xpath:// form [@name =" addMemberForm"] / div [14] / div / button]

当用btn.click()事件错误触发时,表示元素不可见

  

org.openqa.selenium.ElementNotVisibleException:元素不可见     (会话信息:chrome = 52.0.2743.82)     (驱动程序信息:chromedriver = 2.23.409687(c46e862757edc04c06b1bd88724d15a5807b84d1),platform = Linux 4.2.0-42-generic x86_64)(警告:服务器未提供任何堆栈跟踪信息)   命令持续时间或超时:11毫秒   构建信息:版本:'未知',修订版:' 2aa21c1',时间:' 2016-08-02 14:59:43 -0700'   系统信息:主持人:' kyben-All-Series',ip:' 127.0.1.1',os.name:' Linux',os.arch:& #39; amd64',os.version:' 4.2.0-42-generic',java.version:' 1.8.0_101'   驱动程序信息:org.openqa.selenium.chrome.ChromeDriver   功能[{applicationCacheEnabled = false,rotate = false,mobileEmulationEnabled = false,networkConnectionEnabled = false,chrome = {chromedriverVersion = 2.23.409687(c46e862757edc04c06b1bd88724d15a5807b84d1),userDataDir = / tmp / .org.chromium.Chromium.8Xt3v7},takeHeapSnapshot = true, databaseEnabled = false,handlesAlerts = true,hasTouchScreen = false,version = 52.0.2743.82,platform = LINUX,browserConnectionEnabled = false,nativeEvents = true,acceptSslCerts = true,locationContextEnabled = true,webStorageEnabled = true,browserName = chrome,takesScreenshot = true, javascriptEnabled = true,cssSelectorsEnabled = true}]   会话ID:0f787065444f6b2cddf2c6ff5e6c056d       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)       at java.lang.reflect.Constructor.newInstance(Constructor.java:423)       在org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)       在org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)       在org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:683)       在org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:319)       在org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:85)       在testCase.teamMemberNew2.chngPassLogout(teamMemberNew2.java:127)       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       at java.lang.reflect.Method.invoke(Method.java:498)       at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)       at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)       在org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)       at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)       at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)       at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)       在org.testng.TestRunner.privateRun(TestRunner.java:774)       在org.testng.TestRunner.run(TestRunner.java:624)       在org.testng.SuiteRunner.runTest(SuiteRunner.java:359)       在org.testng.SuiteRunner.run顺序(SuiteRunner.java:354)       在org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)       在org.testng.SuiteRunner.run(SuiteRunner.java:261)       在org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)       在org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)       at org.testng.TestNG.runSuitesSequentially(TestNG.java:1215)       在org.testng.TestNG.runSuitesLocally(TestNG.java:1140)       在org.testng.TestNG.run(TestNG.java:1048)       at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)       在org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152)       在org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:57)

3 个答案:

答案 0 :(得分:2)

你可以检查几件事:

  1. 明显的:点击它时按钮是否可见?元素定位器是否正确?

  2. 页面上是否有其他元素具有相同的xpath?具有相同xpath的元素可能位于某个背景页面上/或者是某些隐藏小部件的一部分。因此,findElement()实际上指向隐藏按钮。

  3. 您是否尝试过为按钮提供唯一ID?这将有助于您唯一地找到该按钮。

答案 1 :(得分:1)

您可以使用显式等待等待按钮在单击

之前显示
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement btn = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//form[@name=\"addMemberForm\"]/div[14]/div/button")));
btn.click();

此按钮最长可等待10秒钟。

您也可以在点击

之前尝试移动按钮
WebDriverWait wait = new WebDriverWait(driver, 10);
Actions action = new Actions(driver);

WebElement btn = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//form[@name=\"addMemberForm\"]/div[14]/div/button")));
action.moveToElement(btn).perform();
btn.click();

答案 2 :(得分:0)

有时错误消息“元素不可见”表示您可能无法将对象放置在当前浏览器窗口视图中。您可能需要滚动浏览器才能在单击之前找到对象。 如果是这种情况,您可能需要在单击之前滚动浏览器以使对象居中。您可以在按钮单击之前添加以下代码。

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView(false);", btn);

请注意,“btn”是您的WebElement对象。 以上代码适用于我的Firefox浏览器。但我看到其他一些答案建议设置scrollIntoView(true);.您可以尝试两者,看看哪一个更好。

相关问题