【问题标题】:How to select a Modal form and enter data to the input fields using Java如何使用 Java 选择模态表单并在输入字段中输入数据
【发布时间】:2019-03-21 00:31:24
【问题描述】:

我正在尝试使用 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)**

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

【问题讨论】:

  • 你能在调试模式下访问'setUserName'中的txtUserName吗?尝试使用下面添加的 pyton 代码时,我没有遇到任何模态表单问题。
  • @supputuri - 我的脚本能够导航到登录窗口,但它无法访问 txtUserName 或其中的任何字段。
  • 您是否将驱动程序传递给班级? LoginPage lp = new LoginPage(); 应该是 LoginPage lp = new LoginPage(driver); 吗?

标签: java selenium modal-dialog


【解决方案1】:

您已切换到新窗口以访问该元素。这是完整的 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); 

        }

输出:

【讨论】:

  • 当我尝试运行您的代码时,我收到以下错误消息:在端口 1225 上启动 ChromeDriver 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}) 线程中的异常“main” org.openqa.selenium.SessionNotCreatedException:会话未创建:此版本的 ChromeDriver 仅支持 Chrome 版本 74 驱动程序信息:driver.version:com.expedia.rough.LoginTest.main 的 ChromeDriver(LoginTest.java:18)
  • This version of ChromeDriver only supports Chrome version 74 此声明表示您的机器上安装了较低版本的 chrome 浏览器。请更新您的 chrome 浏览器版本。希望这会有所帮助。
  • 感谢您的回复。将 ChromeDriver 版本从 73 更新到 74 后,我能够运行您的脚本。感谢您的帮助。
  • @Hemansu :很高兴为您提供帮助。如果有帮助,你能接受我的回答吗?
  • 当然可以。谢谢
【解决方案2】:

这是我运行的没有任何问题的 python 代码。 wait_for_element_present 是一个等待元素预设并返回 web 元素的方法。

url = "https://www.expedia.com/ "
driver.get(url)

driver.find_element_by_css_selector("#header-account-menu").click()
accountSignIn = wait_for_element_present('css',"#account-signin")
accountSignIn.click()
email = wait_for_element_present('css',"#gss-signin-email")
email.send_keys("hello")
driver.find_element_by_css_selector("#gss-signin-password").send_keys("hello")
driver.find_element_by_css_selector("#gss-signin-submit").click()

Java 代码 相当于我上面代码中的wait_for_element_present。示例代码源表单https://www.seleniumhq.org/docs/04_webdriver_advanced.jsp]

WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

【讨论】:

  • 感谢您的回复。由于我使用的是 Java 语言,我不确定是否仍然可以在其中使用“wait_for_element_present”方法。
  • 您应该能够使用我在更新答案中发布的代码来实现 wait_for_element 。有关更多信息,请参阅我添加的链接。
  • 我能够解决这个问题。感谢您的帮助。
  • 酷,请在我的回答左侧选择否决按钮下方的复选框以接受我的回答。
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 2021-01-11
  • 2019-04-26
  • 2021-12-26
  • 2015-10-21
  • 2022-11-17
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多