RF-元素定位

588 阅读1分钟

一 定位元素找不到的问题

(1)页面加载慢,去进行相关操作时,元素还没有加载出来

    a. 可以加如下关键字

Wait Until Element Is Visible   elementlocator   timeout   errormessage
ex:
Wait Until Element Is Visible   //input[text()="role"]   30   this element can't be found

  b. 可以用sleep 增加延时    

sleep   3

(2) 提示元素ElementClickInterceptedException:click intercepted

a. 定位元素,页面有多个相同的元素, 我们可以先把所有的元素都找到,然后取自己需要的那个元素去操作

@{ele_list}    Get WebElements    ${ele_locator}
log many    @{ele_list}
click element   @{ele_list}[0]

b. 定位元素,元素被隐藏,比如一些元素是需要其他操作触发才能出现,这时我们可以先触发,使其在页面显示,并用鼠标操作

click element {locator} # 触发使其显示 mouse over {ele_locator} # 鼠标悬停其上 click element ${ele_locator} # 进行点击

c. 定位元素,点击被另外一个元素接收了,这时有可能是因为,这个元素是一个蒙层动画中的元素,过几秒后消失。等消失后,就可以点击想要的元素了,可以在点击之间添加延时,或是执行js

${status}   ${return_value}  Run Keyword And Ignore Error   click element   ${input_checkbox_locator}
log  ${status}+${return_value}
run keyword if  "${status}" != "PASS"    ExectureJSClick   ${input_checkbox_locator}

# 自定义关键字
ExectureJSClick     
[Arguments]    ${locator}     
execute javascript    document.evaluate('${locator}', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0).click()

(3) StaleElementReferenceException

1)重新刷新页面:driver.refresh(),此方法对此问题解决非常有效,但是我的测试场景中不允许刷新,否则,查询结果就变化了,所以此方法不能使用,尝试使用接下来的方法:设置等待时间。

 2)设置等待时间:time.sleep(n),对脚本使用此方法,但是仍然报错,并没有解决我的问题。PS某些情况下此等待是可以解决此问题的,但是并不是时常奏效 

 3)捕捉异常StaleElementReferenceException,然后重新获取元素,此方法比较靠谱,并且我的脚本使用此方法后,执行通过。