Robotframework解决Selenium2Library中的select frame无法选择没有name也没有id的frame或者iframe的问题

       一个平常的页面的输入框,始终无法定位到该控件,查看源代码才知道用到了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 indextag=iframe1
        之后测试顺利通过。

        这里要注意的是Python对于空格的有着严格的使用规则,请大家在修改源文件时先做好备份,使用一个Python IDE工具进行修改,这样写的错误语法有提示的,可以使用自带的IDLE即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值