这应该是如此简单,但我显然遗漏了一些东西:
<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();
}
它返回:
2017年8月16日上午9:07:16 org.openqa.selenium.remote.ProtocolHandshake createSession INFO:检测到的方言:OSS
java.lang.NullPointerException at org.openqa.selenium.support.ui.Select。(Select.java:44)at apps.web.modules.staplespay.CreditCardsScreen.selectScenario(CreditCardsScreen.java:27)
我在这里失踪的超级显而易见的事情是什么?
答案 0 :(得分:1)
您的testWhileBroken()
方法对我来说很好。 (假设类名是ABC.class
)
但是你面临java.lang.NullPointerException at org.openqa.selenium.support.ui.Select.(Select.java:44)
的原因是因为在你的PageFactory
类中(我们假设类名是XYZ.class
)你只声明了WebDriver
的实例as:
private WebDriver driver;
就 PageFactory
与 POM
而言,我们必须初始化测试类中的页面对象(即{{1} }})通过调用 ABC.class
方法,您传递 initElements()
的实例,即 WebDriver
作为参数如下:
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
这会照顾 //XYZ.class
WebDriver driver;
//constructor
public XYZ(WebDriver XYZDriver)
{
this.driver=XYZDriver;
}
答案 1 :(得分:0)
您缺少传递页面类构造函数的驱动程序。所以它找不到驱动程序并抛出NullPointerException:
预期代码为:
<form name="myForm">
<label>
Enter your name:
<input type="text"
name="myName"
ng-model="name"
ng-minlength="5"
ng-maxlength="20"
required />
</label>
<pre>myForm.myName.$error = {{ myForm.myName.$error | json }}</pre>
<div ng-messages="myForm.myName.$error" style="color:maroon" role="alert">
<div ng-message="required">You did not enter a field</div>
<div ng-message="minlength">Your field is too short</div>
<div ng-message="maxlength">Your field is too long</div>
</div>
</form>
在测试执行器类中,确保已实例化webdriver并在创建对象时传递它,如
public class TestClass
{
// all your webelements
public TestClass(WebDriver driver)
{
PageFactory.initElements(driver, this);
}
// all your intended function
}
答案 2 :(得分:0)
或替代解决方案是更改为页面创建对象的方式。 改变这个:
CreditCardsScreen cc = new CreditCardsScreen();
到:
CreditCardsScreen cc = PageFactory.initElements(driver, CreditCardsScreen.class);