在我的应用程序中,当用户第一次登录时,然后在首页上显示用户名(使用@factory的数据驱动方法)。但是,如果用户注销并再次登录,则新页面将显示以下文字。
You're signed out now.
Click here to sign in again.
我的问题是如何检查此文本-'Click Here'是否存在,然后单击它并执行登录功能中提到的相同操作。
我尝试实现if-else块,以检查是否显示了该Webelement,然后单击它并执行与登录功能相同的操作。
org.openqa.selenium.NoSuchElementException: Cannot locate an element using xpath=//a[@href='/Account/Login']
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
尽管我可以通过指定此元素以单击“注销”功能来成功实现我的结果。但是当我的测试最终完成时,它总是会点击它。
@FindBy(xpath="//a[@href='/Account/Login']")
WebElement clickHere;
//要检查的功能
if (clickHere.isDisplayed())
{
clickHere.click();
username.sendKeys(strUsername);
nextBtn.click();
password.sendKeys(strPassword);
loginButton.click();
System.out.println("Successfully Logged");
}
else
{
username.sendKeys(strUsername);
nextBtn.click();
password.sendKeys(strPassword);
loginButton.click();
System.out.println("Successfully Logged");
}
请提出一种解决方案,以便每次登录时登录。
答案 0 :(得分:1)
clickHere.isDisplayed()
给出了NoSuchElementException
,因为您要查找的UI上没有该元素。
因此,要解决您的问题,您可以通过pagefactory获取该元素的列表,然后找到该列表的大小,如果该大小大于0,则表示该元素存在于页面上,否则该元素不存在。
您需要在代码中进行以下更改,然后才能正常工作:
您需要使用以下方法获取元素列表:
@FindAllBy(xpath="//a[@href='/Account/Login']")
List<WebElement> clickHere;
并在代码中进行以下更改:
if (clickHere.size()>0){
clickHere.get(0).click();
username.sendKeys(strUsername);
nextBtn.click();
password.sendKeys(strPassword);
loginButton.click();
System.out.println("Successfully Logged");
}
else{
username.sendKeys(strUsername);
nextBtn.click();
password.sendKeys(strPassword);
loginButton.click();
System.out.println("Successfully Logged");
}
答案 1 :(得分:0)
将(clickHere.isDisplayed())
替换为下面的内容。
if(driver.findElements(By.xpath("//a[@href='/Account/Login']") ).size() != 0)
如果您想坚持自己的pagefactory,则可以使用以下方法
// below line will click on the "Click Here" link if only it's present
try {clickHere.click();}catch(Exception e) {}
username.sendKeys(strUsername);
nextBtn.click();
password.sendKeys(strPassword);
loginButton.click();
System.out.println("Successfully Logged");
如果您只想捕获NoSuchElementPresent
异常,则可以更新以仅捕获该异常。
答案 2 :(得分:0)
您可以为您的PageObject和Baselet创建强大的ClassClass isElementOnPage
基类:
public class BasePage {
private WebDriver driver;
public BasePage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
protected boolean isElementOnPage(WebElement webElement) {
try {
webElement.getTagName();
} catch (Exception e) {
return false;
}
return true;
}
}
您的班级:
public class PageClass extends BasePage {
@FindBy(xpath="//a[@href='/Account/Login']")
private WebElement clickHere;
public PageClass(WebDriver driver) {
super(driver);
}
public PageClass YourMethod(){
if(isElementOnPage(clickHere)){
clickHere.click();
// your logic here
}else {
// your logic here
}
return this;
}
}