代码之家  ›  专栏  ›  技术社区  ›  soccerway

边缘浏览器中的Selenium web驱动程序测试引发空指针异常

  •  0
  • soccerway  · 技术社区  · 5 年前

    当运行下面的 Selenium Web driver 在java中测试边缘浏览器,它抛出 null pointer 例外但是chrome浏览器的测试成功运行,有人能告诉我们这个问题吗?

    JAVAlang.NullPointerException位于 付款测验。基本测试。beforethod(BaseTest.java:33)位于 太阳反映NativeMethodAccessorImpl。调用0(本机方法)位于 太阳反映NativeMethodAccessorImpl。在以下位置调用(未知源) JAVA朗。反思。方法在以下位置调用(未知源) 在 组织。testng。内部的方法调用助手。invokeMethodConsideringTimeout(MethodInvocationHelper.java:64) 在

    testng.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="Suite" thread-count="1" parallel="tests" >
    <test name="RepayCalculatorTestChrome">
    <parameter name="browser" value="Chrome" />
    <packages>
        <package name="payment.tests" />
    </packages>
    </test>
    <test name="RepayCalculatorTestEdge">
    <parameter name="browser" value="Edge" />
    <packages>
        <package name="payment.tests"/>
    </packages>
    </test>
    </suite>
    

    BaseTest.java

    public class BaseTest {
    
        public WebDriver driver;
        public EdgeDriver edgeDriver;
    
        @BeforeMethod
        @Parameters("browser")
        public void beforeMethod(String browser) {
            //Check if parameter passed from TestNG is 'Edge'
            String localDir = System.getProperty("user.dir");
            if(browser.equalsIgnoreCase("edge")){
                //set path to msedgedriver.exe
                System.setProperty("webdriver.edge.driver",localDir + "\\resources\\msedgedriver.exe");
                System.out.println("Edge Driver started...");
                edgeDriver.manage().window().maximize();
                edgeDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
                edgeDriver.get("test_url_here");
            }
            //Check if parameter passed from Testng is 'chrome'
            else if(browser.equalsIgnoreCase("chrome")){
                //set path to chromedriver.exe
                System.setProperty("webdriver.chrome.driver",localDir + "\\resources\\chromedriver.exe");
                System.out.println("Chrome Driver started...");
                ChromeOptions options = new ChromeOptions();
                //options.addArguments("--headless");
                driver = new ChromeDriver(options);
                driver.manage().window().maximize();
                driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
                driver.get("test_url_here");
            }
            
        }
    
        @AfterMethod
        public void tearDown() {
            if (driver != null || edgeDriver !=null) {
                driver.quit();
                System.out.println("Driver get instantiated. Quitting..");
            } else {
                System.out.println("Driver is null so nothing to do");
            }
        }
    
    }
    

    RepayCalculatorTest.java

    public class RepayCalculatorTest extends BaseTest {
        
        String borrowAmount = "750000";
        String interestAmount = "2";
        String loanTerm = "30";
        
        @Test(enabled = true)
        public void loanRepayCalculator() throws InterruptedException {
            RepayCalculatorPage repayCalculator = new RepayCalculatorPage(driver);
            repayCalculator.setBorrowAmount(borrowAmount);
            WebElement webElement1 = driver.findElement(By.xpath("//input[@placeholder='Enter interest rate']"));
            webElement1.clear();
            repaymentCalculator.setInterestAmount(interestAmount);
            WebElement webElement2= driver.findElement(By.xpath("//input[@placeholder='Enter loan term']"));
            webElement2.clear();
            repaymentCalculator.setLoanTerm(loanTerm);
            repaymentCalculator.getCalculateLoanPaymentBtn();
            //driver.manage().timeouts().implicitlyWait(7, TimeUnit.SECONDS);
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
            WebElement resultElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='calculatedresult']//div[@class='_3Kmts']//div[@class='ant-row _2kHnl']//div[contains(@class,'z-k7K ant-col-xs-24')]//p[@class='_3TRls _2fRgA']")));
            String resultText = resultElement.getText();
            System.out.println("EMI amount:"+resultText);
            Assert.assertEquals("$2,772 / month*", resultText);
        }
    
    }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Alexey R.    5 年前

    代码中几乎没有问题。

    第一:

    在这里:

    if(browser.equalsIgnoreCase("edge")){
        //set path to msedgedriver.exe
        System.setProperty("webdriver.edge.driver",localDir + "\\resources\\msedgedriver.exe");
        System.out.println("Edge Driver started...");
        edgeDriver.manage().window().maximize();
        edgeDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        edgeDriver.get("test_url_here");
    }
    

    你打电话 edgeDriver.manage() 然而 edgeDriver 字段尚未初始化。

    第二:

    即使您使用 边缘驱动 driver 领域当你为chrome运行它时,你需要初始化 驾驶员 字段,以便您的测试工作正常。

    当您为Edge运行代码时,您的代码将初始化 边缘驱动 离开你的 驾驶员 字段引用 null .因为你的测试与 驾驶员 左侧引用的字段 无效的 NullPointerException .

    此代码应能更好地工作:

    @BeforeMethod
    @Parameters("browser")
    public void beforeMethod(String browser) {
        //Check if parameter passed from TestNG is 'Edge'
        String localDir = System.getProperty("user.dir");
        if(browser.equalsIgnoreCase("edge")){
            //set path to msedgedriver.exe
            System.setProperty("webdriver.edge.driver",localDir + "\\resources\\msedgedriver.exe");
            System.out.println("Edge Driver started...");
            driver = new EdgeDriver();
        }
        //Check if parameter passed from Testng is 'chrome'
        else if(browser.equalsIgnoreCase("chrome")){
            //set path to chromedriver.exe
            System.setProperty("webdriver.chrome.driver",localDir + "\\resources\\chromedriver.exe");
            System.out.println("Chrome Driver started...");
            ChromeOptions options = new ChromeOptions();
            //options.addArguments("--headless");
            driver = new ChromeDriver(options);
        }
        
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get("test_url_here");
    
    }