我是自动化新手的人。我目前正在学习使用JAVA的Selenium Webdriver以及Page Object Model模式。当我尝试使用几行代码时,我自己就陷入了困境。我为页面元素创建了一个单独的类文件,其中包含以下代码。
public class SamplePage {
WebDriver Driver;
public WebElement Gmail_Email_TextBox = Driver.findElement(By.xpath(".//*[@id='Email']"));
public WebElement Gmail_Email_Next_Button = Driver.findElement(By.xpath(".//*[@id='next']"));
public SamplePage(WebDriver Driver) { //This is a constructor.
System.out.println("Constructor");
this.Driver = Driver;
}
}
当尝试在另一个类中调用上面的页面时,我得到java.lang.NullPointerException。请找到下面的代码。
public class SampleTestMethod {
WebDriver Driver;
@BeforeMethod
public void BrowserLaunch() throws InterruptedException {
Driver = Browser.LaunchMozillaFirefox("https://accounts.google.com/ServiceLogin?continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&service=mail&sacu=1&rip=1");
}
@Test
public void TestCase1() {
SamplePage Sample1 = new SamplePage(Driver);
Sample1.Gmail_Email_TextBox.click();
}
}
请在此澄清我。根本没有调用构造函数。这就是我所观察到的。
答案 0 :(得分:1)
Gmail_Email_TextBox
和Gmail_Email_Next_Button
等类字段在构造函数调用之前被评估为null ,之后从未更改过。这就是原因。
简单地说:在不同的地方初始化这些字段。
您可以为每个注释添加@FindBy
注释,然后只使用PageFactory
:
SamplePage samplePage = new SamplePage();
PageFactory.initElements(driver, samplePage);
遵循命名约定并使用camelCase。
在构造函数调用之前初始化实例变量。 看看这个就自己看看:
public class Example {
private String instanceVariable;
private String anotherInstanceVariable = instanceVariable + " appended.";
public Example(String instanceVariable) {
this.instanceVariable = instanceVariable;
}
public static void main(String[] args) {
Example example = new Example("The first one");
System.out.println(example.anotherInstanceVariable);
}
}
instanceVariable
就像您的driver
。 anotherInstanceVariable
就像您的WebElement
一样。