#selenium #selenium-webdriver #robotframework
#selenium #selenium-webdriver #robotframework
Вопрос:
Я пытаюсь написать несколько тестовых примеров роботов, и я застрял. Мне нужно извлечь некоторые ссылки со страницы. Ссылки хранятся внутри <li>
тега, который также находится внутри <ul>
. Проблема в том, что после извлечения первой ссылки мне нужно перейти к следующей <li>
(первый <li>
следующий брат или сестра), но как я могу найти, есть ли следующий брат или сестра, без получения ошибки или остановки приложения. Я знаю, я могу использовать Element Should Contain
ключевое слово, но в случае, если оно не содержит, я получаю сообщение об ошибке.
Я хочу сделать что-то вроде этого:
if next sibling exist do something
else go do something else
HTML должен выглядеть следующим образом.
<ul id="top_menu" role="menubar" class="">
<li class="menu_accordion_section" id="cat_1">
<a href="some-exampe"> </a>
</li>
<li class="menu_accordion_section" id="cat_2">
<a href="some-exampe"> </a>
</li>
</ul>
Ответ №1:
Существует прямое сообщение, вы можете использовать execute script для создания переменной.
итак, я создал ключевое слово
Validate child element exists
для поиска дочернего элемента внутри родительского элемента требуется два аргумента parent(Webelement) и child(Xpath).
Validate child element exists ${parent} ./h3
Предполагая, что родительский xpath равен as : //ul[@id="top_menu"]
, приведенный выше код будет искать эквивалентный xpath //ul[@id="top_menu"]/./h3
обратите внимание, что контекст является родительским, а не корневым
так что это будет равно xpath
*** Test Cases ***
Google Search
[Tags] you probably do not have this many tags in real life
Wait Until Element Is Visible CSS=[id="introduction-container"]
${parent}= Get webelement xpath=//*[@id="introduction-container"]
${result}= Validate child element exists ${parent} ./h3
Should Be True ${result}
*** Keywords ***
Validate child element exists
[Arguments] ${parent} ${child}
${child}= Execute Javascript return window.document.evaluate( arguments[1], arguments[0], null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; ARGUMENTS ${parent} ${child}
[Return] ${child}
Комментарии:
1. Можете ли вы объяснить мне, что делает эта строка
${child}= Execute Javascript return window.document.evaluate( arguments[1], arguments[0], null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; ARGUMENTS ${parent} ${child}
2. docuemnt.evaluate — это способ найти элемент с помощью xpath в движке javascript браузера
3. developer.mozilla.org/en-US/docs/Web/API/Document/evaluate
4. Эта ссылка объясняет другой аргумент, который он принимает, короче говоря, он проверяет xpath с родительским узлом в качестве ссылки
5. ключевое слово возвращает первый найденный дочерний элемент
Ответ №2:
одним из решений является перебор меню, следуйте примеру кода (этот код не был протестирован, возможно, потребуются некоторые корректировки):
List<WebElement> menuItens = getDriver().findElement(By.id("top_menu")).findElements(By.tagName("li"));
List<String> links = new ArrayList<>();
menuItens.forEach(item -> {
links.add(item.findElement(By.tagName("a")).getAttribute("href"));
});
return links;