繁体   English   中英

如何使用 POM 检查 Selenium 中元素的可见性

[英]How to check for visibility of an element in Selenium using POM

我有一个页面,我需要检查按钮的可见性并单击它(如果存在),否则跳过该步骤。 使用 POM,我尝试了以下方法

#方法 -1

WebDriver driver;

WebElement searchForButton = driver.findElement(By.xpath("//*@id=\"root\"]/div/div[2]/div/div[2]/div/div[2]/div[2]/div"));

public void buttonValidation() {
    searchForButton.click();
}

在按钮不可见的情况下,这种方法将失败。

#方法-2:

 @FindBy(xpath= "//*[@id=\"root\"]/div/div[2]/div/div[1]/div/div/div[2]/button[1]/span[1]")
 private List<WebElement> elements;
    

 public boolean isElementPresent() {
        return elements != null && elements.size()>0 ; 
    }
    
 public void validateButton() throws InterruptedException {
        
        Thread.sleep(3000);
        Boolean b = isElementPresent();
        
        if(b)
        {
            WebElement btn = driver.findElement(By.xpath("//*@id='root']/div/div[2]/div[2]/div[1]/div/div/div[2]/button[1]"));  //JAVA NULL POINTER EXCEPTION HERE
            btn.click();
        }
       }

使用这种方法,为btn搜索抛出 java.lang.NullPointerException

什么是正确的方法?

您可以使用此通用方法:

public boolean clickVisible(By element){
    try {
        wait.until(ExpectedConditions.visibilityOfElementLocated(element));
        driver.findElement(element).click();
        return true;
    }catch (Throwable t){
        return false;
    }
}

它将获得一个元素的 By 定位器作为参数。 如果发现元素可见,则将单击该元素并返回true否则将返回false
所以你可以像这样使用它:

if(clickVisible(By.xpath("//*@id='root']/div/div[2]/div[2]/div[1]/div/div/div[2]/button[1]"))){
    //your flow for case the element found visible and was clicked
}else{
    //your flow for alternative case
}

顺便说一句,强烈不建议使用像这样自动生成的定位器//*@id='root']/div/div[2]/div[2]/div[1]/div/div/div[2]/button[1]因为它们极易碎且非常不可靠。
Google提供了两个以及许多其他教程来学习如何选择正确、可靠的定位器。

在这些场景中使用 try catch

try {
  WebElement btn = driver.findElement(By.xpath("//*@id='root']/div/div[2]/div[2]/div[1]/div/div/div[2]/button[1]"));  //JAVA NULL POINTER EXCEPTION HERE
  btn.click();
}
catch (Exception e) { /* do nothing */ }

您的isElementPresent()应该采用列表args ,因为您正在验证

elements != null && elements.size()>0 

所以它应该是这样的:

public boolean isElementPresent(List<WebElement> elements) {
    return elements != null && elements.size()>0 ; 
}

你的调用者方法应该是这样的:-

public void validateButton() throws InterruptedException {
    Thread.sleep(3000);
    if(isElementPresent(elements))
    {
        WebElement btn = driver.findElement(By.xpath("//*@id='root']/div/div[2]/div[2]/div[1]/div/div/div[2]/button[1]"));  //JAVA NULL POINTER EXCEPTION HERE
        btn.click();
    }
}

您的第一种方法可以包含在try-catch block :-

public void buttonValidation() {
    try {
        searchForButton.click();
    }
    catch(Exception e) {
        e.printStackTrace();
        System.out.println("Something went wrong");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM