【问题标题】:Selenium+Java - Unable to find WebElements in pageSelenium+Java - 无法在页面中找到 WebElements
【发布时间】:2016-03-19 06:03:42
【问题描述】:

我正在为工作做一些自动化操作,现在我正在尝试通过我们的店面自动进行购买,该购买应该进入贝宝沙盒并完成购买。一切看起来都不错,我知道一般流程有效,但是当我到达第一个 PayPal 页面时,我无法找到 webElements。

流程的 PayPal 端包含 2 个页面。一个输入登录信息,另一个确认购买。第二页运行良好,但当我告诉它查找电子邮件/密码字段和登录按钮时,第一页总是给我“无法找到元素”。如果让驱动程序出于调试目的打印出当前 URL,它会正确打印 payPal URL,因此它正在查看正确的站点。我还尝试延迟 30 秒以确保这不是时间问题并且我遇到了同样的问题。

这是有问题的类文件:

public class PayPalLoginPage extends AbstractPaymentPage {
    //AbstractPaymentPage extends from AbrstractPageObject

      private WebElement email; //Element ID is email
      private WebElement password; //Element ID is password
      @FindBy(id = "btnLogin")
      private WebElement loginButton;

      public PayPalLoginPage(WebDriver driver) {
        super(driver);
        PageFactory.initElements(driver, this);
      }


      public PayPalPurchaseConfirmationPage login (PayPalInfo payPalInfo) {
        email.sendKeys(payPalInfo.getEmail());
        password.sendKeys(payPalInfo.getPassword());
        loginButton.click();
        this.waitForPayPalLoadingCurtainToDisappear();
        return new PayPalPurchaseConfirmationPage(this.getDriver());
      }

我调用这个类的方式是这样的:

case PAYPAL_PURCHASE:
  setDriver(new PayPalLoginPage(getDriver()).login(getPaymentMethod()).confirmPayPalPurchase());
  break;

因此,流程一直运行良好,直到它到达第一个 payPal 页面,它只是停止说它找不到这 3 个元素中的任何一个。如果我将它设置为只是在那里等待并手动填写信息,那么它会在下一页上直接获取并从它们开始工作(在第二个 payPal 页面上找到所有元素并对其进行操作)。

如果我将 findElement.By 行放在登录方法中,我会得到相同的行为,并且无论我是尝试使用 id、name、xpath 还是 css 来查找它们,都会得到相同的结果。

知道我可能会错过什么吗?

【问题讨论】:

    标签: java selenium paypal


    【解决方案1】:

    您只是将电子邮件和关注者定义为 WebElement,但没有将它们分配给任何 Web 元素。请参阅以下内容:

    private WebElement email = driver.findElement(By.id("email_text_box_id"));
    private WebElement password = driver.findElement(By.id("password_text_box_id"));
    private WebElement loginbutton = driver.findElement(By.id("login_button_id"));
    

    如果您希望 PageObject 分配 WebElements,那么您需要在案例中调用 initElement

    public class PayPalLoginPage extends AbstractPaymentPage {
    //AbstractPaymentPage extends from AbrstractPageObject
    
      private WebElement email; //Element ID is email
      private WebElement password; //Element ID is password
      @FindBy(id = "btnLogin")
      private WebElement loginButton;
    
      public PayPalPurchaseConfirmationPage login (PayPalInfo payPalInfo) {
        email.sendKeys(payPalInfo.getEmail());
        password.sendKeys(payPalInfo.getPassword());
        loginButton.click();
        this.waitForPayPalLoadingCurtainToDisappear();
        return new PayPalPurchaseConfirmationPage(this.getDriver());
      }
    }
    

    调用支付宝登录函数:

    public class UsingPayPalLoginPage {
        public static void main(String[] args) {
          // Create a new instance of a driver
          WebDriver driver = new HtmlUnitDriver();
    
          // Create a new instance of the PayPall page
          // and initialise any WebElement fields in it.
          PayPalLoginPage page = PageFactory.initElements(driver, PayPalLoginPage.class);
    
          // call login of paypal.
          page.login(payPalInfo);
      }
    } 
    

    【讨论】:

    • 只要变量与元素的ID同名或命名为“PageFactory.initElements(driver, this);” line 默认情况下应该执行该分配。我在所有其他 pageObject 类中都以相同的方式使用它并且它有效。
    • 感谢您的更新,但我遇到了同样的错误。 case PAYPAL_PURCHASE: PayPalLoginPage payPalLoginPage = PageFactory.initElements(getDriver(), PayPalLoginPage.class); setDriver(payPalLoginPage.login((PayPalInfo) customerInfo.getPaymentMethod()).confirmPayPalPurchase()); break; 仍然返回“无法找到元素”消息。
    • setDriver(new PayPalLoginPage(getDriver()).login(getPaymentMethod()).confirmPayPalPurchase());你正在调用页面类你需要调用UsingPayPalLoginPage
    • 谢谢,但我添加了新课程,但我仍然遇到同样的问题。我还尝试删除所有 pageFactory 的东西,并在登录方法开始时简单地执行此操作:email = webDriver.findElement(By.id("email")); email.sendKeys(payPalInfo.getEmail()); 我仍然得到元素未找到异常......我不知道我做错了什么>。
    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2019-02-24
    • 2021-09-05
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多