2.5 Selenium自动化特殊场景处理
2.5.1 切换iframe
在自动化中如果不切换iframe,会定位不到元素。
示例:
场景:我们要上传图片,修改自己的头像信息,我们定位到这个input标签了,但是执行代码的时候会提示no such element
是因为这里有个iframe标签,没有切入到这个iframe就定位不到这个元素。
我们看一下Selenium进入iframe和退出iframe的方法吧!
进入iframe:
driver=webdriver.Chrome()
ele= driver.find_element_by_xpath
driver.switch_to.frame(ele)
退出iframe:
driver.switch_to.default_content()
这里要注意的只有一点,就是进入iframe是一层一层的进, 退出就是退到最外层。
2.5.2 浏览器多窗口处理
浏览器的多窗口就是指多个浏览器窗口,并且是从同一个浏览器进程中打开的多个窗口,对于这种场景,只能切换浏览器窗口,否则会定位不到元素。
场景:
处理方法:
driver=webdriver.Chrome()
#获取浏览器的句柄,如果有两个窗口就会以列表的方式存放句柄
handles=self.driver.window_handles
#handles的值(如果有两个窗口)
#['CDwindowA98D9D7B1619891BC09F2371409053F2','CDwindowE9C615316E388A6108755D7972E79B3A']
handles= driver.window_handles
#关闭当前窗口
driver.close()
#切换到新窗口
driver.switch_to.window(handles[1])
这样就完成了窗口的切换。
2.5.3 鼠标键盘操作
在Selenium的使用中,有时候会需要用到一些鼠标、键盘类的用户操作场景。比如说:快捷键的测试、鼠标右键、悬停的测试等等,下面我们来看一下怎么进行键盘和鼠标的操作。
2.5.3.1 键盘操作
在Selenium中键盘的操作需要使用Keys库,这个库里面定义了许多预定义的键盘按钮。
比如说:Keys.TAB tab键,Keys.Enter回车键。
我们可以使用dir(Keys)命令列出全部元素,使用Keys.名称就可以啦!
2.5.3.2 鼠标操作
在Selenium中鼠标操作需要使用ActionChains库。
在处理鼠标操作呢,我们要建立一个ActionChains的对象,他需要的参数是webdriver的对象,在通过action调用ActionChains里面的方法完成鼠标的操作。
```python
driver=webdriver.Chrome
ele= driver.find_element_by_xpath(‘xpath表达式’)
action=ActionChains(driver)
#我们来看下ActionChains里面的方法:
#左键点击ele元素
action.click(ele).perform()
#右键点击ele元素
action.context_click(ele).perform()
#双击
action.double_click(ele).perform()
#拖放到指定坐标位置
action.drag_and_drop_by_offset(ele,10,10).perform
#拖放到目标元素位置
action.drag_and_drop(ele,target). perform
#鼠标在指定坐标悬停
action.move_by_offset(10,10).perform
#鼠标在指定元素悬停
action.move_to_element(ele).perform()
2.5.4 上传文件
上传文件有两种方式,第一种上传文件是input标签呢,type属性是file。直接sendkeys就行,比如这种,直接定位元素然后上传
第二种上传文件非input,这个时候要使用PyUserInput模块,具体参考下面的博客:
https://blog.youkuaiyun.com/zyooooxie/article/details/88141601
2.5.5 执行JavaScript脚本
在自动化测试过程中,总会有一个特殊场景,是需要进行一些非常规操作的,比如执行JavaScript脚本,通过js脚本操作web页面。
driver=webdriver.Chrome()
driver.execute_script(‘js脚本’)
2.5.6 截屏
在进行自动化测试时,截屏操作还是很有必要的,比如说后面要说的验证码破解,以及二次封装时记录出现问题时的截图等等。
#driver浏览器对象,将整个页面截图
driver.get_screenshot_as_png()
#ele元素,将对应元素的位置截图,保存为…/lib/verify/verify.png
ele.screenshot(’…/lib/verify/verify.png’)