我在点击事件中遇到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)
答案 0 :(得分:2)
你可以检查几件事:
明显的:点击它时按钮是否可见?元素定位器是否正确?
页面上是否有其他元素具有相同的xpath?具有相同xpath的元素可能位于某个背景页面上/或者是某些隐藏小部件的一部分。因此,findElement()实际上指向隐藏按钮。
您是否尝试过为按钮提供唯一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);.您可以尝试两者,看看哪一个更好。