java.lang.NullPointerException в ExpectedConditions с использованием Selenium через WebDriverManager - PullRequest
1 голос
/ 26 сентября 2019

Следующая строка выдает ошибку:

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)

Ответы [ 3 ]

0 голосов
/ 26 сентября 2019

разница в том, что visibilityOfElementLocated () проверяет некоторые стили элемента, такие как ширина и высота, тогда как senceOfElementLocated () должен проверять толькосуществование.https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#visibilityOfElementLocated-org.openqa.selenium.By-

Действительно ли ваш элемент видим на странице?


Также было бы неплохо увидеть трассировку стека, поскольку .until () должен вызывать TimeoutException, если элемент не найден, а не Null Pointer

https://www.seleniumhq.org/docs/04_webdriver_advanced.jsp

0 голосов
/ 27 сентября 2019

WebDriverManager

WebDriverManager позволяет автоматизировать управление двоичными драйверами (например, chromedriver, geckodriver и т. Д.), Требуемыми для Selenium WebDriver .Добавив следующую строку:

WebDriverManager.chromedriver().setup(); 

WebDriverManager выполняет для вас следующие задачи:

  • Проверяет версию браузера, установленного на вашем компьютере (т.е. Chrome).
  • Проверяет версию драйвера (т.е. chromedriver).Если он неизвестен, он использует последнюю версию драйвера.
  • Он загружает двоичный файл WebDriver, если он отсутствует в кэше WebDriverManager (~/.m2/repository/webdriver по умолчанию).
  • Экспортирует правильныйПеременные среды Java WebDriver, необходимые для Selenium.

Перемещение вперед вместо создания driver из ChromeDriver Класс , который необходимо использовать WebDriver интерфейс .Поэтому вам нужно заменить:

ChromeDriver driver = new ChromeDriver(options);

на:

WebDriver driver = new ChromeDriver(options);
0 голосов
/ 26 сентября 2019

Я заметил, что в вашем WebDriver объявлено implicitlyWait.Когда вы настроили implicitlyWait, вам не нужно использовать явные ожидания, такие как wait.until.

Когда вы смешиваете неявные и явные ожидания, как в этом примере, вы можете получить некоторые неожиданные результаты, некоторые объяснения здесь .

Вы можете попытаться удалить операторы wait.until и посмотреть, работает ли ваш код.

...