Найти, существует ли следующий сиблинг

#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;