首页 > 解决方案 > 如何使用 Java 选择模态表单并在输入字段中输入数据

问题描述

我正在尝试 使用 Selenium WebDriver 和 Java测试https://www.expedia.com/站点的登录功能。我也在使用页面对象工厂设计模式。

登录程序是:转到上面的站点->单击帐户菜单->选择“登录”选项。出现一个新的弹出登录窗口,我正在尝试使用我的自动化脚本输入电子邮件地址和密码。

这是我处理 Expedia 登录表单的代码:

LoginPage.java 包含:

{

    @FindBy(id = "gss-signin-email")
    public WebElement txtUserName;

    @FindBy(id = "gss-signin-password")
    public WebElement txtPassword;

    @FindBy(id = "gss-keep-signin-check-label")
    public WebElement chkBoxKeepMeSignIn;

    @FindBy(id = "gss-signin-submit")
    public WebElement btnSignIn;

    public void setUserName(String uname) {

        txtUserName.click();
        txtUserName.sendKeys(uname);
    }

public void setPassword(String pwd) {

    txtPassword.click();
    txtPassword.sendKeys(pwd);
}

public void setKeepMeSignIn() {

    chkBoxKeepMeSignIn.click();
}

public void clickSignIn() {

    btnSignIn.click();
}

}

TC_LoginTest_001.java 包含:

{

    Page.menu.gotoAccounts();

    Page.menu.gotoSignIn();

    LoginPage lp = new LoginPage();

    driver.switchTo().activeElement();

    lp.setUserName(config.getProperty("username"));

    lp.setPassword(config.getProperty("password"));

    lp.setKeepMeSignIn();

    lp.clickSignIn();

}

当我使用 Run As --> TestNg Suite 运行我的脚本时,我收到以下错误消息:

**LoginTest
java.lang.NullPointerException
at com.expedia.pages.LoginPage.setUserName(LoginPage.java:42)
at com.expedia.testcases.TC_LoginTest_001.LoginTest(TC_LoginTest_001.java:38)**

未在输入字段(即电子邮件地址和密码)中输入测试数据。看起来我的脚本无法识别模态表单。请建议我应该如何解决这个问题。

标签: javaseleniummodal-dialog

解决方案


您必须切换到新窗口才能访问该元素。这是完整的 java 代码。希望这会有所帮助。

public static void main(String[] args) {

        System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + File.separator + "\\Executables\\Chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.expedia.com/");     
        String parentHandle = driver.getWindowHandle(); 
        WebElement element=driver.findElement(By.id("header-account-menu"));
        Actions action=new Actions(driver);
        action.moveToElement(element).click().build().perform();
        driver.findElement(By.id("account-signin")).click();
        for (String winHandle : driver.getWindowHandles()) {
            driver.switchTo().window(winHandle); 
            WebDriverWait wait = new WebDriverWait(driver, 30);
            WebElement elementemail = wait.until(ExpectedConditions.elementToBeClickable(By.id("gss-signin-email")));
            elementemail.sendKeys("xyz@gmail.com");
            WebElement elementpass = wait.until(ExpectedConditions.elementToBeClickable(By.id("gss-signin-password")));
            elementpass.sendKeys("xxxxxxx");

        }
        driver.switchTo().window(parentHandle); 

        }

输出:

在此处输入图像描述


推荐阅读