我是Selenium学习的新手。我尝试在我的代码中使用网络元素null pointer exception
时收到Milestone_Tile_Text.click;
但是当我使用
LoginTestScript.fd.findElement(By.linkText("Milestone")).click();
请参阅下面的代码我也使用PageFactory.initElements
,但不知道如何解决此错误。
public class MilestoneTileModel
{
GenerateTestData objtestdata = new GenerateTestData() ;
public MilestoneTileModel() //constructor
{
PageFactory.initElements(LoginTestScript.fd, this);
}
@FindBy(xpath="//a[text()='Milestone']")
WebElement Milestone_Tile_Text;
public void Milestone_Tile_Click()
{
Milestone_Tile_Text.click();
LoginTestScript.fd.findElement(By.linkText("Milestone")).click();
LoginTestScript.fd.findElement(By.xpath("//*@id='CPH_btnAddNewMilestoneTop']")).click();
}
}
答案 0 :(得分:0)
使用init方法时,可能会更频繁地发生计时问题。
计时问题是当你初始化一个元素时,驱动程序会立即尝试查找元素,如果失败,你将不会收到任何警告,但元素将引用null。
以上情况可能会发生,例如因为页面未完全呈现或驱动程序看到旧版本的页面。
修复可以将元素定义为属性,并在属性的get
上使用驱动程序从页面获取元素
请注意,selenium不承诺驱动程序会看到最新版本的页面,因此即使这可能会中断,在某些情况下重试也会有效。
答案 1 :(得分:0)
我看到的第一个问题:你没有设置LoginTestScript
首先,您需要设置PageObject变量:
GoogleSearchPage page = PageFactory.initElements(driver, GoogleSearchPage.class);
丰富这一点的最佳方法是单独的页面对象模型和场景划分
你的拳头文件POM应该包含:
LoginTestPOM
public class LoginTestPOM {
@FindBy(xpath="//a[text()='Milestone']")
WebElement MilestoneTileText;
public void clickMilestoneTitleText(){
MilestoneTitleText.click();
}
}
TestScript
import LoginTestPOM
public class TestLogin {
public static void main(String[] args) {
// Create a new instance of a driver
WebDriver driver = new HtmlUnitDriver();
// Navigate to the right place
driver.get("http://www.loginPage.com/");
// Create a new instance of the login page class
// and initialise any WebElement fields in it.
LoginTestPOM page = PageFactory.initElements(driver, LoginTestPOM.class);
// And now do the page action.
page.clickMilestoneTitleText();
}
}
这是Page Object Pattern的基础。
注意:我只在浏览器中编写该代码,因此可能包含一些错误。
LINK:https://github.com/SeleniumHQ/selenium/wiki/PageFactory
没有页面对象模式的“丑陋”解决方案是:
UglyTestScript
public class UglyTestLogin {
public static void main(String[] args) {
// Create a new instance of a driver
WebDriver driver = new HtmlUnitDriver();
// Navigate to the right place
driver.get("http://www.loginPage.com/");
// DON'T create a new instance of the login page class
// and DON'T initialise any WebElement fields in it.
// And do the page action.
driver.findElement(By.xpath("//a[text()='Milestone']").click()
}
}