我已经附加了POM,BaseTest和Test类。我通过右键单击项目尝试将其作为TestNG测试运行,因此下面的代码得到NullPointerException。请问可以建议吗?
POM课程:
package pom;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Introduction
{
@FindBy(xpath="//a[text()='Hello. Sign In']")
WebElement signInLink;
public Introduction(WebDriver driver)
{
PageFactory.initElements(driver, this);
}
public void signIn()
{
signInLink.click();
}
}
BaseTest类:
package scripts;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.*;
public class BaseTest
{
public WebDriver driver;
@BeforeSuite
public void preCondition()
{
driver= new FirefoxDriver();
driver.get("https://www.walmart.com/");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@AfterSuite
public void postCondition()
{
driver.close();
}
}
测试类:
package scripts;
import org.testng.annotations.Test;
import pom.Introduction;
public class SignIn extends BaseTest
{
@Test
public void validSignIn()
{
Introduction i= new Introduction(driver);
i.signIn();
}
}
答案 0 :(得分:0)
您的代码存在一些问题。
{{introText}}
中实例化您的网络驱动程序。这会导致每个@BeforeSuite
标记仅创建一次webdriver实例。因此,所有其他<suite>
方法始终会获得@Test
,因为NullPointerException
带注释的方法不会第二次执行。所以要开始,我建议将测试代码更改为下面的内容
<强> BaseTest.java 强>
@BeforeSuite
<强> SignIn.java 强>
package scripts;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.*;
public class BaseTest {
private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
@BeforeMethod
public void preCondition() {
driver.set(new FirefoxDriver());
driver.get().get("https://www.walmart.com/");
}
@AfterMethod
public void postCondition() {
driver.get().quit();
}
public final WebDriver driver() {
return driver.get();
}
}
我们所做的就是选择使用package scripts;
import org.testng.annotations.Test;
import pom.Introduction;
public class SignIn extends BaseTest {
@Test
public void validSignIn() {
Introduction i = new Introduction(driver());
i.signIn();
}
}
和@BeforeMethod
来实例化和清理webdriver,因为这些方法可以保证在每个@AfterMethod
方法之前和之后执行。然后我们继续使用@Test
的{{1}}变体,因为ThreadLocal确保每个线程都获得自己的webdriver副本,以便您可以轻松地开始并行运行测试。现在这不是一个问题,但很快你将面临这个问题,因为你开始构建你的实现。您可以阅读我的this blog帖子,了解有关如何使用TestNG求助于并行执行的更多信息。