【问题标题】:Exception in thread "main" java.lang.NullPointerException when trying to run a test case in Selenium with Java尝试使用 Java 在 Selenium 中运行测试用例时,线程“main”java.lang.NullPointerException 中的异常
【发布时间】:2021-07-05 12:02:33
【问题描述】:

这是我的 Java 代码:

package test;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;

public class FirstSeleniumTest {

public static WebDriver driver;

public static void main(String[] args) {

    System.setProperty("webdriver.chrome.driver","C:\\Users\\35196\\IdeaProjects\\selenium test\\SeleniumTest\\lib\\seleniumjars\\chromedriver.exe");

    driver = new ChromeDriver();

    driver.navigate().to("https://foodplanhealth.herokuapp.com/login");

    driver.manage().window().maximize();

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

    WebElement root1 = driver.findElement(By.cssSelector("my-app"));
    WebElement shadow_root1 = expand_shadow_element(root1);

    WebElement root2 = shadow_root1.findElement(By.cssSelector("mwc-drawer"));
    WebElement shadow_root2= expand_shadow_element(root2);

    WebElement root3 = shadow_root2.findElement(By.name("appContent"));
    WebElement shadow_root3 = expand_shadow_element(root3);

    WebElement root4 = shadow_root3.findElement(By.tagName("div#main-content"));
    WebElement shadow_root4 = expand_shadow_element(root4);

    WebElement root5 = shadow_root4.findElement(By.cssSelector("div#container"));
    WebElement shadow_root5 = expand_shadow_element(root5);

    WebElement root6 = shadow_root5.findElement(By.cssSelector("login-container"));
    WebElement shadow_root6 = expand_shadow_element(root6);

    WebElement root7 = shadow_root6.findElement(By.cssSelector("mwc-textfield"));
    WebElement shadow_root7 = expand_shadow_element(root7);

    WebElement root8 = shadow_root7.findElement(By.cssSelector("mdc-text-field__ripple"));
    WebElement shadow_root8 = expand_shadow_element(root8);

    WebElement login = shadow_root8.findElement(By.cssSelector("mdc-text-field__input"));

    String js = "arguments[0].setAttribute('value','random@email.com')";
    ((JavascriptExecutor) driver).executeScript(js, login);

}

public static WebElement expand_shadow_element(WebElement element)
{
    return (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot", element);
}
}

代码运行良好,直到第 35 行 WebElement root4 = shadow_root3.findElement(By.tagName("div#main-content")); 我在哪里得到这个错误

线程“main”中的异常 java.lang.NullPointerException at test.FirstSeleniumTest.main(FirstSeleniumTest.java:35)

我知道整个代码不正确且不完整,但由于此错误,我无法继续前进。我只是不明白为什么它在这一点上工作正常,但它没有。我向某人寻求帮助,他们告诉我代码对他们来说运行良好,我检查了 chrome 驱动程序版本,它与浏览器版本匹配。

谁能告诉我怎么回事?

【问题讨论】:

  • div#main-content 是标签名吗?看起来像选择器
  • 第 35 行的某些内容为 null,您不能在 null 对象上调用方法

标签: java selenium google-chrome selenium-chromedriver


【解决方案1】:

NullPointerException 始终暗示空指针已取消引用,方法是评估空引用后的句点,或者将空索引作为数组。

让我们在您的源代码行中研究这个案例:

WebElement root4 = shadow_root3.findElement(By.tagName("div#main-content")); 

取消引用运算符(句点)只有两次出现:我们必须丢弃By 之后的那个,因为它是一个类,不能为空。所以我们只剩下一个罪魁祸首:shadow_root3 肯定是空的。

下一步:为什么shadow_root3 为空?它在前一行中被初始化:

root3 = shadow_root2.findElement(By.name("appContent"));
WebElement shadow_root3 = expand_shadow_element(root3);

方法expand_shadow_element返回输入参数的shadowRoot(如果没有,则返回null),因此我们必须得出结论,名为appContent的DOM元素没有shadowRoot集合。

从这里开始,您必须调试您的 HTML 页面以诊断为什么它没有 shadowRoot,以及如何正确设置它。

【讨论】:

  • 你是对的,我试图阴影根的元素不在阴影树中。另一条评论帮助我纠正了这个问题。非常感谢!
【解决方案2】:

由于它引发空指针异常,它无法找到元素。您可能需要更改 xpath 或通过定位器来识别元素。

以下是访问电子邮件文本框的代码

String cssSelectorForHost1 = "my-app[title='FoodPlan']";
String cssSelectorForHost2 = "page-login";
String cssSelectorForHost3 = "mwc-textfield[type='email']";
Thread.sleep(1000);
WebElement shadowDomHostElement0 = driver.findElement(By.cssSelector("my-app[title='FoodPlan']"));
WebElement last0 = (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", shadowDomHostElement0);
Thread.sleep(1000);
WebElement shadowDomHostElement1 = last0.findElement(By.cssSelector("page-login"));
WebElement last1 = (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", shadowDomHostElement1);
Thread.sleep(1000);
WebElement shadowDomHostElement2 = last1.findElement(By.cssSelector("mwc-textfield[type='email']"));
WebElement last2 = (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", shadowDomHostElement2);
Thread.sleep(1000);
last2.findElement(By.cssSelector(".mdc-text-field__input"))

【讨论】:

  • 很抱歉反馈迟了,但非常感谢!结果很完美
  • 如果它帮助您选择它作为正确答案
猜你喜欢
  • 1970-01-01
  • 2013-11-21
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多