Как передать динамическое значение в xpath в selenium, java?

#selenium #xpath

Вопрос:

У меня есть веб-сайт, где я открываю контракт и получаю уникальный контракт. Затем мне нужно перейти на другую страницу и выполнить поиск по этому идентификатору в таблице с разбиением на страницы. Я написал код, который переходит на следующую страницу, если этот идентификатор запроса(это ссылка) не найден, и если он существует, он просто открывает этот идентификатор запроса. Но есть проблема с инициализацией webelement, где я пытаюсь добавить динамическое значение. Селен выдает ошибку ниже, и я понятия не имею, как ее решить

org.openqa.селен.Исключение NoSuchElementException: такого элемента нет: Не удается найти элемент: {«метод»:»xpath»,»селектор»:»//span[@class=’ссылка__текст’ и текст()=’222254′]/../../..//ввод»} (Информация о сеансе: chrome=89.0.4389.72)

ContractID-это переменная, в которой я храню динамическое значение, изменяющееся при каждом запуске теста. Вот как выглядит код:

     csecp.waitForElementVisibility(csecp.getContractStatusEmergencyChangeHeader());
        int totalPages = Integer.parseInt(csecp.getTotalPagesString().getText());
        for(int i = 0; i < totalPages; i  ) {
            csecp.sleep(500);
            if (**csecp.prepareWebElementWithDynamicXpath(csecp.getContractDynamicValue(),contractId).isDisplayed()**) {
                csecp.prepareWebElementWithDynamicXpath(csecp.getContractDynamicValue(),contractId).click();
                csecp.waitForElementVisibility(csecp.getConfirmAMLApprovalButton());
                csecp.getConfirmAMLApprovalButton().click();
                break;
            }
            csecp.waitForElementVisibility(csecp.getNextPageButton());
            csecp.getNextPageButton().click();
        }
 

Вот как я пытаюсь передать динамическое значение в xpath

    private String contractDynamicValue = "//span[@class='link__text' and text()='xxxxx']/../../..//input";

    public WebElement prepareWebElementWithDynamicXpath (String xpathValue, String substitutionValue ) {

        return getWebDriver().findElement(By.xpath(xpathValue.replace("xxxxx", substitutionValue)));
    }
 

Ответ №1:

Вы можете определить и использовать этот локатор XPath следующим образом:

 String contractDynamicValue = "//span[@class='link__text' and text()='%s']/../../..//input";

public WebElement prepareWebElementWithDynamicXpath (String xpathTemplate, String substitutionValue ) {
    String xpath = String.format(xpathTemplate,substitutionValue);
    return getWebDriver().findElement(By.xpath(xpath));
}
 

Ответ №2:

Смотрите xpath, который вы используете, это

 //span[@class='link__text' and text()='xxxxx']/../../..//input
 

и если вы хотите сделать xxxxx так же динамично, вы могли бы сделать следующее :-

 string sub_value = "222254";
//span[@class='link__text' and text()='" sub_value "']/../../..//input
 

Ответ №3:

Это всегда лучшее решение, чтобы получить элемент по тексту и следующий элемент. Для динамических элементов вы можете использовать XPath, например

  //div[.='Dummy_text']/following::span[text()='test_text']
 

Вы можете ознакомиться с некоторыми учебными пособиями здесь
https://www.guru99.com/xpath-selenium.html