[英]How can i locate web element for 'dropdown-toggle' window in selenium webdriver
[英]How can I locate this element with selenium webdriver?
这应该很简单,但我显然遗漏了一些东西:
<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 信息:检测到方言: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()
方法对我来说看起来不错。 (假设 Class 名称为ABC.class
)
But the reason you are facing java.lang.NullPointerException at org.openqa.selenium.support.ui.Select.(Select.java:44)
is because in your PageFactory
class (let us assume the Class name is XYZ.class
) you仅将WebDriver
的实例声明为:
private WebDriver driver;
就使用POM
的PageFactory
而言,我们必须通过调用initElements()
方法来初始化测试 class 中的页面对象(即ABC.class
),您将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();
}
现在,在页面 object class(即在XYZ.class
中)除了声明WebDriver
的实例外,您还必须定义一个构造函数,如下所示:
//XYZ.class
WebDriver driver;
//constructor
public XYZ(WebDriver XYZDriver)
{
this.driver=XYZDriver;
}
这将处理NullPointerException
您缺少传递页面 class 构造函数的驱动程序。 所以它没有找到驱动程序并抛出 NullPointerException:
预期的代码是:
public class TestClass
{
// all your webelements
public TestClass(WebDriver driver)
{
PageFactory.initElements(driver, this);
}
// all your intended function
}
在你的测试执行器 class 中确保你已经实例化了 webdriver 并在 object 创建时传递它
CreditCardsScreen cc = new CreditCardsScreen(driver);
public void testWhileBroken() {
// select Scenario Two
cc.selectScenario("Secondary (Amex)");
// enter a Custom Amount
cc.enterCustomAmount("1.23");
// click Select
cc.clickSelect();
}
或者替代解决方案是更改为页面创建 object 的方式。 改变这个:
CreditCardsScreen cc = new CreditCardsScreen();
到:
CreditCardsScreen cc = PageFactory.initElements(driver, CreditCardsScreen.class);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.