Как сделать параметр в xpath и сделать коды более удобными для чтения, если есть несколько одинаковых строк, java, селен - PullRequest
1 голос
/ 05 августа 2020

Я написал этот логический метод, но хочу сделать его короче и умнее, поскольку есть 3 одинаковые строки с одинаковыми XPath. Может ли кто-нибудь помочь мне с этим, пожалуйста? спасибо

    public boolean VerifyKORSecDispaly() {
    
    boolean a = driver
            .findElement(By
                    .xpath("(//tr[@data-testid='row']//td[@class='kor'])[1]//span[@class='da']"))
            .getText().contains("d");
    boolean b = driver
            .findElement(By
                    .xpath("(//tr[@data-testid='row']//td[@class='kor'])[2]//span[@class='da']"))
            .getText().contains("d");
    boolean c = driver
            .findElement(By
                    .xpath("(//tr[@data-testid='row']//td[@class='kor'])[3]//span[@class='da']"))
            .getText().contains("d");

    if (a == true && b == true && c == true) {
        return true;
    } else {
        return false;
    }
}

1 Ответ

1 голос
/ 05 августа 2020

Вы можете использовать List<>, поскольку вы используете индексы в xpath.

//tr[@data-testid='row']//td[@class='kor'] <- этот селектор вернет несколько элементов </p>

На основе этих элементов мы можем найти span[@class='da'] element.

Код:

public boolean VerifyKORSecDispaly() {
    boolean a = doesRowTextContain(0, "d");
    boolean b = doesRowTextContain(1, "d");
    boolean c = doesRowTextContain(2, "d");

    if (a == true && b == true && c == true) {
        return true;
    } else {
        return false;
    }
}

private boolean doesRowTextContain(int index, String expectedString) {
    By spanSelector = By.xpath(".//span[@class='da']"); //the dot . reduces the scope of the element. Instead of searching through all the elements in source, we'll reduce the scope to parent element
    List<WebElement> dataRows = driver.findElements(By.xpath("//tr[@data-testid='row']//td[@class='kor']"));
    
    return dataRows.get(index).findElement(spanSelector).getText().contains(expectedString);
}

Еще одна вещь - вам не нужно сравнивать a, b or c с true, поскольку это ожидаемое значение по умолчанию в выражении if.

    if (a && b && c) {
        return true;
    } else {
        return false;
    }

Или даже

return a && b && c:)

Окончательные методы могут выглядеть так:

public boolean VerifyKORSecDispaly() {
    return doesRowTextContain(0, "d") && doesRowTextContain(1, "d") && doesRowTextContain(2, "d");
}

private boolean doesRowTextContain(int index, String expectedString) {
    By spanSelector = By.xpath(".//span[@class='da']"); //the dot . reduces the scope of the element. Instead of searching through all the elements in source, we'll reduce the scope to parent element
    List<WebElement> dataRows = driver.findElements(By.xpath("//tr[@data-testid='row']//td[@class='kor']"));
    
    return dataRows.get(index).findElement(spanSelector).getText().contains(expectedString);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...