我正在尝试创建一个自动化场景,其中输入登录凭据并单击“登录”按钮,然后搜索一个元素。如果显示元素,则它会打印有效凭据,如果未显示元素,则它会执行一些其他操作,但单击“登录”按钮后代码不起作用。 这里我为它创建了一个方法。
public void toCheckLoginVerification() throws InterruptedException,MalformedURLException {
clickOnSignInbutton();
enterEmailId("[email protected]");
enterPassword("Test@123");
clickOnSignInButtonOnSignInScreen(); //code not working after this.
boolean x = driver.findElement(By.xpath("//android.view.View[@content-desc='Trips']")).isDisplayed();
if(x==true) {
System.out.println("Valid Credentials");
} else {
System.out.println("Invalid Credentials");
clearEmailid();
clearPassword();
enterEmailId("[email protected]");
enterPassword("Test@123");
clickOnSignInButtonOnSignInScreen();
clickOnProfileButtonOnHomeScreen();
}
}
我在其他类中创建了上述方法,但在这里调用它们。 更具体地说,我正在使用 Appium。
您应该使用显式等待而不是隐式等待。
使用您的代码,selenium 会找到刚刚创建但尚未完全加载/渲染的元素。因此,当您的
driver.findElement(By.xpath("//android.view.View[@content-desc='Trips']"))
返回该元素时,它仍然不显示/可见。public boolean waitForElementToBeVisible(String xpath, int delay) {
wait = new WebDriverWait(driver, delay);
try {
wait.until(ExpectedConditions.visibilityOfElementLocated(element));
return true;
}catch (Exception e){
return false;
}
}
现在你可以说:
if(waitForElementToBeVisible("//android.view.View[@content-desc='Trips']",10)){
System.out.println("Valid Credentials");
} else{
System.out.println("Invalid Credentials");
clearEmailid();
clearPassword();
enterEmailId("[email protected]");
enterPassword("Test@123");
clickOnSignInButtonOnSignInScreen();
clickOnProfileButtonOnHomeScreen();
}
您正在检查该元素是否立即显示。 相反,您应该使用 selenium 的隐式或显式等待机制
boolean x = driver.findElement(By.xpath("//android.view.View[@content-desc='Trips']")).isDisplayed(); webelement 接口仅向您的变量返回 true。你的变量 x 中应该有布尔值 false。只有这样,你的 else 语句才会起作用