异常-
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(); } }
您看到的错误“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
方法会等待,直到元素变得可见或超时到期。
这可确保您的脚本在与其交互之前等待搜索框出现,从而使您的测试更加稳健。
希望这有帮助!...