这应该很简单,但我显然遗漏了一些东西:
<div>
<label>
Scenario
<select id="scenarios">
<option value="0">Default (Visa)</option>
<option value="1">Secondary (Amex)</option>
</select>
<button onclick="pickScenario()">Select</button>
</label>
<label style="padding-left: 2em;">
Custom Amount: $
<input type="text" id="custom_amount">
</label>
</div>
尝试使用以下代码定位三个元素(scenarioDropdown、selectButton、customAmount)中的任何一个时,我不断收到 NullPointerExceptions
返回。我已经使用 id、xpath 和 css 尝试了所有这三种方法,但下面我将针对每个元素展示一种方法:
@FindBy(css = "#scenarios")
private WebElement scenariosDropdown;
@FindBy(xpath = "//button[contains(.,'Select')]")
private WebElement select;
@FindBy(how = How.ID, using = "custom_amount")
private WebElement customAmount;
private WebDriver driver;
public void selectScenario(String scenario) {
Select select = new Select(scenariosDropdown);
select.deselectAll();
select.selectByVisibleText(scenario);
}
void clickSelect() {
select.click();
}
public void enterCustomAmount(String amount) {
customAmount.clear();
customAmount.sendKeys(amount);
}
运行使用以下方法的测试。
public void testWhileBroken() {
// select Scenario Two
cc.selectScenario("Secondary (Amex)");
// enter a Custom Amount
cc.enterCustomAmount("1.23");
// click Select
cc.clickSelect();
}
它返回:
Aug 16, 2017 9:07:16 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: OSS
java.lang.NullPointerException at org.openqa.selenium.support.ui.Select.(Select.java:44) at apps.web.modules.staplespay.CreditCardsScreen.selectScenario(CreditCardsScreen.java:27)
我在这里错过的最明显的事情是什么?
最佳答案
我觉得你的 testWhileBroken()
方法不错。 (假设类名是 ABC.class
)
但是您在 org.openqa.selenium.support.ui.Select.(Select.java:44) 中遇到 java.lang.NullPointerException 的原因是因为在您的
PageFactory
类(让我们假设类名称是 XYZ.class
)您只将 WebDriver
的实例声明为:
private WebDriver driver;
就PageFactory
和POM
而言,我们必须在测试类中初始化页面对象(即在 ABC.class
中)通过调用传递 WebDriver< 实例的
即 initElements()
方法driver
作为参数如下:
//ABC.class
@Test (priority=2)
public void method_name()
{
//Initialize page objects
XYZ xyz = PageFactory.initElements(driver, XYZ.class);
//Call the method
xyz.my_method();
}
现在,在页面对象类中(即在 XYZ.class
中)除了声明 WebDriver
的实异常(exception),您还必须定义一个构造函数,如下所示:
//XYZ.class
WebDriver driver;
//constructor
public XYZ(WebDriver XYZDriver)
{
this.driver=XYZDriver;
}
这将处理 NullPointerException
关于java - 如何使用 selenium webdriver 找到这个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45714661/