机器人框架:如何排序

时间:2019-03-14 14:03:52

标签: robotframework

我有一个带有组合框的网页,可以按价格,名称等...对列表进行排序。该列表位于许多页面中,因此我需要先获取所有元素,然后再进行排序,并检查元素是否为正确。对吧?

我正在尝试这样做,并浏览所有页面并获取所有元素。但是,它仅采用第一页中的元素。我是Robot框架的新手。 有人建议我该怎么做吗?

${name_list_actual}    Create List     
${cnt_pages}=    Get Element Count    //div[@class='container index-new-p']/div/nav[@class='text-center']/ul/li/*
Log To Console    ${cnt_pages}
:FOR    ${n}    IN RANGE    1    ${cnt_pages}
\    Click link    //div[@class='container index-new-p']/div/nav/ul/li[${n}]/a
\    ${cnt}=    Get Element Count     //*[@class="title"]/*
    :FOR    ${i}    IN RANGE    1    ${cnt}
    \    ${get_names}    Get Element Attribute    //table[@class='result-table']/tbody/tr[${i}]/td/div/div[2]/div/a    text     
    \    Append To List    ${name_list_actual}    ${get_names}
      ${get_names}=    Select All From List    //table[@class='result-table']/tbody/tr[${i}]/td/div/div[2]/div/a
\    Log To Console    ${name_list_actual}
\    Continue For Loop

非常感谢

1 个答案:

答案 0 :(得分:-1)

首先,从代码示例的缩进来看,您似乎在嵌套嵌套循环-一个用于更改页面的外部循环,以及一个将在每一行获取文本的内部循环。问题是-Robot Framework不支持嵌套的循环-see the documentation

执行过程中发生的是第一个循环(分页)仅用两个语句运行并完成了:

\    Click link    //div[@class='container index-new-p']/div/nav/ul/li[${n}]/a
\    ${cnt}=    Get Element Count     //*[@class="title"]/*

然后其余的都作为第二部分的一部分执行。

一种解决方案是使用关键字“获取表中的所有值”,该关键字将保留内部循环,并在当前外部循环中对其进行分页。


另一个问题-您正在使用IN RANGE,以1作为开始,以${cnt}作为结束;如果其值为4,则可能希望跟踪变量将所有值从1变为4。
然而,范围只适用于第一个参数,包括但不限于第二个参数;因此,它覆盖了1到3的范围。要挽救它,您需要将上限设置为cnt + 1,例如${cnt + 1}


次要内容:

您有一个语句位于循环块内,但没有前缀\

${get_names}=    Select All From List    //table[@class='result-table']/tbody/tr[${i}]/td/div/div[2]/div/a

我很惊讶它没有给您带来语法错误-它有效地中断了循环,并且框架应该抱怨下一行的前缀就像是在循环中一样,但是没有开始。

-

通过单击更改页面时,不能确保UI已为新页面加载数据。如果通过ajax调用发生这种情况,则您很可能正在处理上一页的数据,认为它是新的-硒单击非常快速地返回控件,并且用于获取文本的操作数正在运行-而UI仍在等待新数据并显示上一个数据。

-

在RF版本3.1 the loop syntax is different中-块成员没有前缀\,并且使用END语句将其关闭。
我建议迁移到它-a)当前将最终弃用,b)在新版本中,嵌套将被标记为语法错误(您要在不使用{{1}的情况下开始新的循环}-运行中的一个),而不是通过静默传递意外行为。

相关问题