通过WebDriverManager使用Selenium在ExpectedConditions中实现java.lang.NullPointerException

通过WebDriverManager使用Selenium在ExpectedConditions中实现java.lang.NullPointerException,selenium,selenium-webdriver,webdriver-manager,webdrivermanager-java,expected-condition,Selenium,Selenium Webdriver,Webdriver Manager,Webdrivermanager Java,Expected Condition,以下行给出了错误: wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='username']"))); 代码如下: WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); options.addArguments("--start-maximized"); options.

以下行给出了错误:

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='username']")));
代码如下:

WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--start-maximized");
options.addArguments("--disable-notifications");
ChromeDriver driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
driver.get("https://test.salesforce.com/");
WebDriverWait wait=new WebDriverWait(driver, 120);
driver.findElement(By.id("username")).sendKeys("");
driver.findElement(By.id("password")).sendKeys("");
driver.findElement(By.id("Login")).click();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(@class,'home-accounts')]")));**
此外,我观察到:

wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//a[contains(@class,'home-accounts')]")));
工作正常

如何处理

堆栈跟踪:

java.lang.NullPointerException
    at org.openqa.selenium.remote.RemoteWebElement.isDisplayed(RemoteWebElement.java:323)
    at org.openqa.selenium.support.ui.ExpectedConditions.elementIfVisible(ExpectedConditions.java:315)
    at org.openqa.selenium.support.ui.ExpectedConditions.access$100(ExpectedConditions.java:44)
    at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:206)
    at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:202)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:248)
    at TestClass.NewTest.TC_DealDetails_0(NewTest.java:70)
    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:124)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

我注意到您在WebDriver中隐式地声明了
等待
。当您配置了
implicitlyWait
时,不需要使用显式等待,例如
wait.until

当您像本例中那样混合隐式和显式等待时,您可能会得到一些意外的结果和解释


您可以尝试删除
等待。直到
语句,然后查看您的代码是否仍然有效。

不同之处在于元素定位的可见性()检查一些元素样式,如宽度和高度,而元素定位的存在性()应该只检查存在性。

您的元素在页面上真的可见吗


另外,最好看到stacktrace,因为如果找不到元素,则.until()应该引发TimeoutException,而不是Null指针

WebDriverManager 允许自动管理所需的二进制驱动程序(例如chromedriver、geckodriver等)。通过添加以下行:

WebDriverManager.chromedriver().setup(); 
是否为您执行以下任务:

  • 它检查安装在您机器上的浏览器版本(即Chrome)
  • 它检查驱动程序的版本(即chromedriver)。如果未知,则使用最新版本的驱动程序
  • 如果WebDriverManager缓存中不存在WebDriver二进制文件(默认情况下,
    ~/.m2/repository/WebDriver
  • 它导出Selenium所需的适当WebDriver Java环境变量
向前移动,而不是从ChromeDriver类创建
驱动程序,您需要使用WebDriver界面。因此,您需要替换:

ChromeDriver driver = new ChromeDriver(options);
与:


元素在网页上可见。堆栈跟踪如下:请问您使用的是什么版本的selenium?这确实是一个一年前修复的问题,是的,自selenium-3.141.0以来就应该有修复了
WebDriver driver = new ChromeDriver(options);