如何使用selenium webdriver定位此元素?

时间:2017-08-16 13:16:01

标签: java selenium testing selenium-webdriver qa

这应该是如此简单,但我显然遗漏了一些东西:

<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)

我在这里失踪的超级显而易见的事情是什么?

3 个答案:

答案 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);