【问题标题】:How can I locate this element with selenium webdriver?如何使用 selenium webdriver 找到此元素?
【发布时间】:2017-08-16 13:16:00
【问题描述】:

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

<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 在 org.openqa.selenium.support.ui.Select.(Select.java:44) 在 apps.web.modules.staplespay.CreditCardsScreen.selectScenario(CreditCardsScreen.java:27)

我在这里遗漏的最明显的事情是什么?

【问题讨论】:

  • 你为Select类导入了哪个包?
  • 你是如何创建对象cc
  • @Tuks import org.openqa.selenium.support.ui.Select;
  • @GaurangShah select..、enter.. 和 click.. 方法在一个临时称为 CreditCardProcessing 的类中,因此 cc 来自 CreditCardsScreen cc = new CreditCardsScreen();
  • 以及构造函数看起来如何CreditCardsScreen()

标签: java selenium testing selenium-webdriver qa


【解决方案1】:

您的testWhileBroken() 方法对我来说看起来不错。 (假设类名是ABC.class

但是您面对java.lang.NullPointerException at org.openqa.selenium.support.ui.Select.(Select.java:44) 的原因是因为在您的PageFactory 类中(让我们假设类名称为XYZ.class)您只将WebDriver 的实例声明为:

private WebDriver driver;

PageFactoryPOM 而言,我们必须通过调用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;
}

这将处理 NullPointerException

【讨论】:

    【解决方案2】:

    您缺少传递页面类构造函数的驱动程序。所以它没有找到驱动程序并抛出 NullPointerException :

    预期的代码是:

    public class TestClass
    {
    
        // all your webelements
        public TestClass(WebDriver driver)
        {
            PageFactory.initElements(driver, this);
    
         }
         // all your intended function
    
    }
    

    在您的测试执行程序类中,确保您已实例化 webdriver 并在创建对象时传递它,例如

    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();
    
      }
    

    【讨论】:

      【解决方案3】:

      或者替代解决方案是更改为页面创建对象的方式。 改变这个:

      CreditCardsScreen cc = new CreditCardsScreen();
      

      到:

      CreditCardsScreen cc = PageFactory.initElements(driver, CreditCardsScreen.class);
      

      【讨论】:

        猜你喜欢
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-11
        • 2017-07-03
        • 1970-01-01
        • 2016-09-07
        • 2017-10-24
        相关资源
        最近更新 更多