簡體   English   中英

嘗試使用 Java 在 Selenium 中運行測試用例時,線程“主”java.lang.NullPointerException 出現異常

[英]Exception in thread "main" java.lang.NullPointerException when trying to run a test case in Selenium with Java

這是我擁有的 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")); 我在哪里得到這個錯誤

test.FirstSeleniumTest.main(FirstSeleniumTest.java:35) 線程“主”中的異常 java.lang.NullPointerException

我知道整個代碼不正確且不完整,但由於此錯誤,我無法繼續前進。 我只是不明白為什么它在這一點上工作正常,但它沒有。 我向某人尋求幫助,他們告訴我代碼對他們來說運行良好,我檢查了 chrome 驅動程序版本,它與瀏覽器版本匹配。

有人可以告訴我有什么問題嗎?

NullPointerException始終意味着 null 指針已被取消引用,方法是評估 null 引用之后的一段時間,或者將 null 索引為數組。

讓我們在您的源代碼行中研究這個案例:

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

解引用運算符(句點)只有兩次出現:我們必須丟棄By之后的那個,因為它是 class 並且不能是 null。 所以我們只剩下一個罪魁禍首: shadow_root3肯定是 null。

下一步:為什么shadow_root3是null? 它在前一行中初始化:

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

方法expand_shadow_element返回輸入參數的shadowRoot (如果沒有,則返回 null),因此我們必須得出結論,名為appContent的 DOM 元素沒有設置shadowRoot

從這里開始,您必須調試您的 HTML 頁面來診斷它沒有shadowRoot的原因,以及如何正確設置它。

它無法找到引發 null 指針異常的元素。 您可能需要更改 xpath 或通過定位器,您正在識別元素。

下面是訪問 email 文本框的代碼

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"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM