【问题标题】:How to get All Text in robot framework ?如何在机器人框架中获取所有文本?
【发布时间】:2014-08-21 10:41:58
【问题描述】:

考虑以下源代码,

<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,但只返回第一个。

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

请推荐

【问题讨论】:

  • 显示您用于 1) 检索列表和 2) 检索文本的完整代码。

标签: selenium selenium-webdriver robotframework


【解决方案1】:

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

${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}

这很有效,但在匹配很多时会相当慢。

【讨论】:

  • 请问您为什么使用“${name}”作为列表名称而不是“@{name}”?
  • 我觉得有错别字,xpath=(${xpath})[${i}]应该是xpath=(${xpath})
  • 这就是为什么我认为当测试用例有点复杂时,RF 很糟糕。它创建了一种新语言,但使它比 python 更复杂且功能更弱。为什么不让我们只使用python,而RF作为一个框架,只是提供了setup机制、teardown、控制测试用例脚本运行、生成器报告等功能。这已经足够了。现在它做得更多但做得不好。关键字开发很糟糕。
【解决方案2】:

您可以扩展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}

【讨论】:

    【解决方案3】:

    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 个以上的内部 LI 容器
    【解决方案4】:

    虽然最受好评的答案完全有效 - 并且是最符合 xpath 的 :),但让我添加一个我还没有看到建议的选项 - 使用 Get Webelements 关键字。例如:

    @{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】:

      @Velapanur

      我有另一个类似的要求,我必须将文本输入到页面的文本区域中。 下面我参考了 Todor 的建议写了这个想法,它奏效了。非常感谢 Todor,Velapanur

      @{Texts}=    Get WebElements    ${AllTextboxes}
      
          :FOR    ${EachTextarea}    in    @{Texts}
      
      \    Input Text    ${EachTextarea}    ${RandomTextdata}
      

      【讨论】:

        【解决方案6】:

        这是在 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)

        【讨论】:

        • 谢谢,但正在寻找机器人框架中的等价物。
        • 谢谢 我已经知道逻辑,只是想要一个机器人框架实现。
        猜你喜欢
        • 2019-03-30
        • 1970-01-01
        • 2020-01-26
        • 1970-01-01
        • 2021-12-16
        • 2015-12-31
        • 1970-01-01
        • 2019-04-06
        • 2017-09-15
        相关资源
        最近更新 更多