我有一个带有组合框的网页,可以按价格,名称等...对列表进行排序。该列表位于许多页面中,因此我需要先获取所有元素,然后再进行排序,并检查元素是否为正确。对吧?
我正在尝试这样做,并浏览所有页面并获取所有元素。但是,它仅采用第一页中的元素。我是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
非常感谢
答案 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}的情况下开始新的循环}-运行中的一个),而不是通过静默传递意外行为。