java - 如何使用 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)**
未在输入字段(即电子邮件地址和密码)中输入测试数据。看起来我的脚本无法识别模态表单。请建议我应该如何解决这个问题。
解决方案
您必须切换到新窗口才能访问该元素。这是完整的 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);
}
输出:
推荐阅读
- javascript - this.$set 无法排序
- android - android studio 无法识别的 xml 文件
- javascript - Node-postgres pool.connect 变得无响应
- node.js - 无法将大文件从 node.js 上传到 onedrive
- python - numpy矩阵乘法每个col和sum
- string - 使用 strcat 访问 Matlab 中的变量
- wordpress - Wordpress PHP 版本与服务器不同
- c# - 当工作处于 HOLD 状态时,dr.Read() 不执行我的 ELSE 代码块,并且我找不到如何为 HOLDED 工作添加 EndTime
- python-3.x - 关于python3.5上的aruco error import 'cv2.aruco' error
- android - 可点击的响应,例如 Dialogflow 中的按钮