繁体   English   中英

如何使用 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;

就使用POMPageFactory而言,我们必须通过调用initElements()方法来初始化测试 class 中的页面对象(即ABC.class ),您将WebDriverdriver的实例作为参数传递,如下所示:

//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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM