如何在机器人框架中获取所有文本?

时间:2014-06-30 23:59:20

标签: selenium selenium-webdriver robotframework

考虑以下源代码,

<div id="groupContainer" class="XXXXXX">

<ul id="GroupContactListWrapper" class="list-wrapper">
    <li class="contactNameItemContainer">

        <div class="contactNameItem">
            <span class="name">Name1</span>
        </div>

    </li>
    <li class="contactNameItemContainer">

        <div class="contactNameItem">
            <span class="name">Name2</span>
        </div>

    </li>
</ul>

</div>

如何在列表变量中检索两个名称(Name1,Name2)? 我尝试了以下xpath来获取&#34;获取文本&#34;关键字,但只返回第一个。

//div[@id='groupContainer']//li[@class='contactNameItemContainer']//span

请建议

6 个答案:

答案 0 :(得分:8)

您可以按如下方式迭代元素:

${xpath}=    Set Variable    //div[@id='groupContainer']//li[@class='contactNameItemContainer']//span
${count}=    Get Matching Xpath Count    ${xpath}
${names}=    Create List
:FOR    ${i}    IN RANGE    1    ${count} + 1
\    ${name}=    Get Text    xpath=(${xpath})[${i}]
\    Append To List    ${names}    ${name}

这有效,但是当有很多比赛时相当慢。

答案 1 :(得分:2)

Get Text将返回与定位器匹配的第一个元素的内容。使用XPATH时,您可以指定要获取的元素的索引,如下所示:

${name1}    Get Text    xpath=//div[@id='groupContainer']//li[@class='contactNameItemContainer'][0]//span
${name2}    Get Text    xpath=//div[@id='groupContainer']//li[@class='contactNameItemContainer'][1]//span
@{names}    Create List    ${name1}    ${name2}

答案 2 :(得分:2)

@Velapanur

我有另一个类似的要求,我必须在页面中将文本输入textareas。 下面我写了关于Todor建议的想法,并且它有效。非常感谢Todor,Velapanur

@{Texts}=    Get WebElements    ${AllTextboxes}

    :FOR    ${EachTextarea}    in    @{Texts}

\    Input Text    ${EachTextarea}    ${RandomTextdata}

答案 3 :(得分:1)

您可以扩展Selenium2Library并为此目的编写自己的关键字。将以下内容另存为Selenium2LibraryExt.py

from Selenium2Library import Selenium2Library


class Selenium2LibraryExt(Selenium2Library):

    def get_all_texts(self, locator):
        """Returns the text value of elements identified by `locator`.
        See `introduction` for details about locating elements.
        """
        return self._get_all_texts(locator)

    def _get_all_texts(self, locator):
        elements = self._element_find(locator, False, True)
        texts = []
        for element in elements:
            if element is not None:
                texts.append(element.text)
        return texts if texts else None

然后,您可以在测试中使用新的Get All Texts关键字:

*** Settings ***
library     Selenium2LibraryExt


*** Test Cases ***
Get All Texts Test
  Open Browser    http://www.example.com   chrome
  @{texts}        Get All Texts            css=.name
  Log Many        ${texts}

答案 4 :(得分:1)

虽然评价最高的答案是完全正常的 - 并且xpath-ish :)最多,但是让我添加一个我还没看到的选项 - 使用Get Webelements关键字。 E.g:

@{locators}=     Get Webelements    xpath=//div[@id='groupContainer']//li[@class='contactNameItemContainer']//span
${result}=       Create List

:FOR   ${locator}   in    @{locators}
\       ${name}=    Get Text    ${locator}
\       Append To List  ${result}  ${name}

它将生成并返回所有匹配元素的列表,您只需迭代它们。它可能比xpath的[index]引用快一点,因为dom被评估一次 - 但如果不完全正确则不要让我负责:)

答案 5 :(得分:-1)

这是获取Java中所有元素的逻辑。你可以根据自己的需要采用它。

你必须使用findElements()而不是findElement()来获取所有元素。

List<WebElement> items = driver.findElements(By.cssSelector("ul#GroupContactListWrapper div.contactNameItem"));

foreach(item in items){
   System.out.println(item.getText();
}

如果您想要列表中的特定元素,可以使用items.get(1)