无法调用“org.openqa.selenium.WebDriver.findElement”,因为“Wait_Selenium.WaitElementToDisplay.driver”为空

问题描述 投票:0回答:1

异常-

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.WebDriver.findElement(org.openqa.selenium.By)" because "Wait_Selenium.WaitElementToDisplay.driver" is null   at Wait_Selenium.WaitElementToDisplay.main(WaitElementToDisplay.java:15)

“”

我正在使用下面一个类的导入方法。

package BrowserFactory;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class BrowserFactory_LaunchBrowser {
  public static WebDriver driver = null;
  public static WebDriver launchBrowser(String browserName) {
      if (browserName.equalsIgnoreCase("chrome")) {
          System.setProperty("webdriver.chrome.driver", "./exeFiles/chromedriver.exe");
          driver = new ChromeDriver();
          System.out.println("Chrome Launched");
      } else if (browserName.equalsIgnoreCase("firefox")) {
          System.setProperty("webdriver.gecho.driver", "./exeFiles/gechodriver.exe");
          driver = new FirefoxDriver();
          System.out.println("FireFox Launched");
      } else if (browserName.equalsIgnoreCase("edge")) {
          System.setProperty("webdriver.edge.driver", "./exeFiles/msedgedriver.exe");
          driver = new EdgeDriver();
          System.out.println("Edge Launched");
      } else if (browserName.equalsIgnoreCase("ie")) {
          System.setProperty("webdriver.chrome.driver", "./exeFiles/IEDriverServer.exe");
          driver = new InternetExplorerDriver();
          System.out.println("Internet Explorer Launched");
      }
      driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);
      driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
      driver.manage().window().maximize();
      driver.navigate().to("https://www.google.com/");
      
      return driver;
  }
  public static void closeBrowser() {
      driver.close();
      System.out.println("Current Browser Closed");
  }
  public static void closeAllBrowser() {
      driver.quit();
      System.out.println("All Browser Closed");
  }
}

我已经完成了导入方法,现在我想等到谷歌搜索框可见,请告诉我使用哪些代码我可以等到该元素可见,还请指导我如何解决此类问题,谢谢?

package Wait_Selenium;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class WaitElementToDisplay {
  public static WebDriver driver;

  public static void main(String[] args) throws NullPointerException, Throwable {
      BrowserFactory.BrowserFactory_LaunchBrowser.launchBrowser("chrome");
      
      //WaitElementToDisplay test = new WaitElementToDisplay();
      Thread.sleep(5000);
      WebElement searchbox = driver.findElement(By.xpath("//textarea[@aria-label='Search']"));
      if (searchbox.isDisplayed()) {
          System.out.println("Searchbox is visible :" + searchbox.isDisplayed());
      } else {
          System.out.println("Searchbox is not visible :" + searchbox.isDisplayed());
      }

      BrowserFactory.BrowserFactory_LaunchBrowser.closeBrowser();
  }                                                                                                   }

我不知道哪个代码造成了这个问题,并且问题与下面的类相关

包Wait_Selenium;

导入java.time.Duration;导入 java.util.concurrent.TimeUnit; 导入 org.openqa.selenium.By;导入 org.openqa.selenium.Keys;进口 org.openqa.selenium.WebDriver;导入 org.openqa.selenium.WebElement; 导入 org.openqa.selenium.chrome.ChromeDriver;进口 org.openqa.selenium.chrome.ChromeOptions;进口 org.openqa.selenium.support.ui.ExpectedConditions;进口 org.openqa.selenium.support.ui.WebDriverWait;

公共类Wait_Selenium {静态WebDriver调用;

public static void main(String[] args) throws Throwable { System.setProperty("webdriver.chrome.driver", “./exeFiles/chromedriver.exe”); ChromeOptions co = 新 ChromeOptions(); 调用 = new ChromeDriver(co); call.manage().deleteAllCookies(); call.manage().window().maximize(); // Selenium 中的隐式等待 call.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); call.get("https://www.google.co.in/"); System.out.println("浏览器 推出”); String searchBox = "//textarea[@title='搜索']"; WebElement 搜索 = call.findElement(By.xpath(searchBox)); search.sendKeys("测试 Selenium"); 搜索.sendKeys(Keys.ENTER);
// 显式等待 - 等待撰写按钮可点击 WebDriverWait 等待 = new WebDriverWait(调用, 持续时间.ofSeconds(30)); 搜索到的字符串 = "//div[starts-with(text(), 'Selenium')][@role='heading']"; wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(searched))); System.out.println("搜索到的项目已显示"); 线程.sleep(10000); 调用.close(); } }

java selenium-webdriver import selenium-chromedriver
1个回答
0
投票

您看到的错误“NullPointerException:无法调用 'org.openqa.selenium.WebDriver.findElement' 因为 'Wait_Selenium.WaitElementToDisplay.driver' 为空”,是因为您尝试使用没有 '尚未初始化。

我可以帮您做的事:

理解问题:

在您的 WaitElementToDisplay 类中,您有一个名为 driver 的 WebDriver 变量声明为静态。但是,在尝试将其与 findElement 一起使用之前,不会为其分配值。 您从 BrowserFactory 类调用 launchBrowser 方法来启动 Chrome,但该方法返回 WebDriver 实例,并且您没有将其存储在 WaitElementToDisplay 中的任何位置。

解决问题:

有两种方法可以解决这个问题:

传递WebDriver实例:

修改WaitElementToDisplay中的main方法以接受WebDriver实例作为参数:

public static void main(String[] args, WebDriver driver) throws NullPointerException, Throwable {
    // Use the passed driver instance here
    WebElement searchbox = driver.findElement(By.xpath("//textarea[@aria-label='Search']"));
    // ... rest of your code
}

然后,在原始代码中,调用 launchBrowser 并将返回的 WebDriver 实例传递给 WaitElementToDisplay 方法:

WebDriver driver = BrowserFactory.BrowserFactory_LaunchBrowser.launchBrowser("chrome");
WaitElementToDisplay.main(args, driver);

使驱动程序静态(细线使用:谨慎使用):

警告:通常不鼓励这种方法,因为它可能导致类之间的紧密耦合并使代码难以维护。但是,对于这种特定情况,这是一个更简单的解决方案。

在BrowserFactory_LaunchBrowser中,将驱动程序变量更改为public static。这使得它可以从其他类访问。

在WaitElementToDisplay中,删除驱动程序的静态声明。现在,您可以直接从 BrowserFactory 访问驱动程序变量。

// In WaitElementToDisplay.main
WebElement searchbox = BrowserFactory.driver.findElement(By.xpath("//textarea[@aria-label='Search']"));

使用显式等待:

Wait_Selenium
中提供的代码演示了使用显式等待的更好方法。其工作原理如下:

它创建一个

WebDriverWait
对象,指定驱动程序和超时持续时间。 它使用
ExpectedConditions.visibilityOfElementLocated
和搜索框定位器定义预期条件。
wait.until
方法会等待,直到元素变得可见或超时到期。

这可确保您的脚本在与其交互之前等待搜索框出现,从而使您的测试更加稳健。

希望这有帮助!...

© www.soinside.com 2019 - 2024. All rights reserved.