Java 硒元素不可见?

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

我在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=“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();

您可以检查的内容很少:

  • 显而易见的问题:当你点击按钮时,它是可见的吗?元素定位器是否正确

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

  • 您是否尝试过为按钮本身提供唯一的id?这将帮助您唯一地定位按钮


  • 有时,错误消息“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