一个平常的页面的输入框,始终无法定位到该控件,查看源代码才知道用到了iframe, 于是使用Select Frame关键字,但还是不行,查看了下Select Frame的用法,它只支持id和name,可我遇到的这个页面中的iframe却都没有id和name属性,试了使用css,xpath都不行的。
可能想着没招了,陷入了沉思。后来想到Robotframework是用python写的,干脆直接去看看源码,然后看能否改下源码解决问题。
于是乎决定打开源码,位置在%PythonHome%\Lib\site-packages\Selenium2Library\keywords\_browsermanagement.py
看看源代码就知道了:Selenium2Library中原有的select_frame函数(对应的关键字为select frame)可根据locator选择frame,但是,若某个frame或者iframe没有id,没有name,而页面存在多个frame或者iframe,则原函数无法实现选择该frame或者iframe的功能。其原因是原函数默认locator可以唯一选择。解决方法也就有了:添加一个Selenium2Library中的select_frame_by_index函数,支持索引选择功能。
找到%PythonHome%\Lib\site-packages\Selenium2Library\keywords\_browsermanagement.py
打开它,找到select_frame这个方法。
将代码复制并修改为如下:修改后的select_frame_by_index函数如下:
def select_frame_by_index(self, locator, index):
"""Sets frame identified by 'locator' as current frame ,
if 'locator' is not unique, use index Key attributes for frames are 'id' and 'name'.
See 'introduction' for details about locating elements.
Example:
| select_frame_by_index | tag=iframe | 1 |
"""
self._info("Selecting frame '%s'." % locator)
if locator.startswith("tag"):
elements = self._element_find(locator,False,True)
element = elements[int(index)]
else:
element = self._element_find(locator, True, True)
self._current_browser().switch_to_frame(element)
此时在RobotFramework可以通过如下方式选择frame
select frame by index | tag=iframe | 1 |
这里要注意的是Python对于空格的有着严格的使用规则,请大家在修改源文件时先做好备份,使用一个Python IDE工具进行修改,这样写的错误语法有提示的,可以使用自带的IDLE即可。