如何使用pom检查selenium中元素的可见性

jmp7cifd  于 2021-09-13  发布在  Java
关注(0)|答案(3)|浏览(302)

我有一个页面,需要检查按钮的可见性,如果有,请单击按钮,否则跳过该步骤。使用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
正确的方法是什么?

anhgbhbe

anhgbhbe1#

您可以使用以下通用方法:

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

它将通过元素的定位器作为参数获取。如果发现元素可见,将单击该元素并 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] 因为它们非常易碎,而且非常不可靠。
谷歌提供了这两个以及许多其他教程来学习如何选择正确、可靠的定位器。

jv4diomz

jv4diomz2#

对于此类场景,请使用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 */ }
7nbnzgx9

7nbnzgx93#

你的 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();
    }
}

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

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

相关问题