#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