Java 硒元素不可见?
我在click事件中遇到有关Selenium的问题Java 硒元素不可见?,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我在click事件中遇到有关Selenium的问题 WebElement btn = driver.findElement(By.xpath("//form[@name=\"addMemberForm\"]/div[14]/div/button")); System.out.print(btn); 打印结果 [[ChromeDriver:LINUX上的chrome(0F787065444F6B2CDDF2CDF2CC6FF5E6C056D)]-> xpath://form[@name=“add
WebElement btn = driver.findElement(By.xpath("//form[@name=\"addMemberForm\"]/div[14]/div/button"));
System.out.print(btn);
打印结果
[[ChromeDriver:LINUX上的chrome(0F787065444F6B2CDDF2CDF2CC6FF5E6C056D)]->
xpath://form[@name=“addMemberForm”]/div[14]/div/button]
当用btn.click()触发时,
事件错误表示元素不可见
org.openqa.selenium.element不可见异常:元素不可见
(会话信息:chrome=52.0.2743.82)
(驱动程序信息:chromedriver=2.23.409687(c46e862757edc04c06b1bd88724d15a5807b84d1),平台=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:'amd64',os.version:'4.2.0-42-generic',java.version:'1.8.0_101'
驱动程序信息:org.openqa.selenium.chrome.ChromeDriver
功能[{applicationCacheEnabled=false,rotatable=false,mobileEmulationEnabled=false,networkConnectionEnabled=false,chrome={chromedriverVersion=2.23.409687(c46e862757edc04c06b1bd88724d15a5807b84d1),userDataDir=/tmp/.org.chromium.8Xt3v7},takesHeapSnapshot=true,databaseEnabled=false,handlesAlerts=true,hasTouchScreen=false,version=52.0.2743.82,platform=LINUX,browserConnectionEnabled=false,nativeEvents=true,acceptSslCerts=true,locationContextEnabled=true,WebStorage=true,browserName=chrome,takesScreenshot=true,javascriptEnabled=true,CSSSelectorEnabled=true}]
会话ID:0F787065444F6B2CDF2C6FF5E6C056D
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于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: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)中
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
位于org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
位于org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816)
位于org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124)
位于org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
位于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.runsequential上(SuiteRunner.java:354)
位于org.testng.SuiteRunner.privateRun(SuiteRunner.java:312)
运行(SuiteRunner.java:261)
位于org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
位于org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
在org.testng.testng.runSuitesSequentially上(testng.java:1215)
位于org.testng.testng.runSuitesLocally(testng.java:1140)
位于org.testng.testng.run(testng.java:1048)
位于org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126)
位于org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152)
位于org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:57)
您可以使用显式等待等待按钮在单击之前可见
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement btn = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//form[@name=\"addMemberForm\"]/div[14]/div/button")));
btn.click();
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();
这将等待10秒钟,按钮才可见
您也可以尝试在单击之前移动到按钮
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement btn = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//form[@name=\"addMemberForm\"]/div[14]/div/button")));
btn.click();
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();
您可以检查的内容很少:
有时,错误消息“element not visible”意味着您的对象可能未放置在当前浏览器窗口视图中。在单击之前,您可能需要将浏览器滚动到以定位对象。 如果是这种情况,您可能需要在单击之前滚动浏览器以使对象居中。您可以在单击按钮之前添加以下代码
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView(false);", btn);
请注意,“btn”是您的WebElement对象。
上面的代码在我的Firefox浏览器中工作。但我看到一些其他答案建议设置scrollIntoView(true);。您可以同时尝试这两种方法,看看哪一种效果更好。@KybenJal您能否将错误消息和按钮html添加到问题中?webdriver来自哪里?它有一个错误part@KybenJal
webdriver
是driver
。我在回答中也做了修改,确保提供的xpath
只找到一个您想要的按钮…在该页面中按f12打开浏览器控制台,并粘贴此$x(“//form[@name='addMemberForm']]/div[14]/div/button”)
a