Selenium做Web自动化踩过的坑
1.无法定位到元素/定位元素超时(selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element/selenium.common.exceptions.TimeoutException)
在确定xpath无误的情况下,找不到元素的原因我遇到的大部分是等待时间较短,元素未加载出来,可以尝试用下面显示等待的方式解决
2.显示等待
如上所说的情况,在自动化实施过程中,尝尝会有在值执行某步操作或者某个命令之前,先看看要操作的元素是否处于显示状态、是否可操作等需求,也就是看看我们期望的场景是否存在。
这时候就可以使用显示等待,会比较节约测试脚本执行时间,程序会每隔一段时间(默认0.5默秒,也可自定义)执行一下自定义的判定条件。如果条件成立,就执行下一步,否则继续等待,直到最长等待时间,然后抛出TimeoutException异常
例:
#最多等待10秒,直到要找的按钮出现并点击
from selenium.webdriver.support.wait import WebDriverWait
self.wait = WebDriverWait(self.driver, 10)
self.wait.until(lambda x: x.find_element(by="xpath",value='//*[@id="app"]/section/main/div/div/div/div/div/div/div/div[2]/div[3]/div/a')).click()
3.iframe或frame处理
在元素定位过程中,如果出现了<frame>或者<iframe>标签,说明该页面中嵌套了一个新的页面,该页面内的元素无法直接定位。如:
因此,在定位新页面元素之前,我们需要先执行driver.switch_to.frame()方法,切换到该frame下面,再对该frame下的元素进行定位和操作
1)定位到iframe
iframe=self.driver.find_element_by_xpath('//*[contains(@id,"x-URS-iframe")]')
2)切换到iframe
self.driver.switch_to.frame(iframe)
3)对iframe上的元素进行操作
self.driver.find_element_by_xpath('//*[@class="j-inputtext dlemail j-nameforslide"]').send_keys("huisefen")
self.driver.find_element_by_xpath('//[@class="j-inputtext dlpwd"]').send_keys("-")
4)退出iframe
如果想操作该frame以外的元素,可以通过driver.switch_to.parent_frame()方法切换到上一级frame,然后我们可以访问该框架外部而不是该框架内部的元素。这样就切换了控制;外部可以是网页的其他框架或一部分。这样我们就可以脱离当前框架。
self.driver.switch_to.parent_frame()
4.运行成功后未生成测试报告
使用unittest后运行时会默认用unittest去运行脚本(如下图)
这样的话就无法执行到main中的生成报告那部分代码,所以我们需要重新配置一下
(1)点击如下图位置Edit Configuration
(2)重新添加需要执行的文件
(3)点击apply-ok
(4)点击Run运行脚本即可
如果仍未解决,可以将光标放在if name == "main":下,右击,选择“run +文件名”的执行方式执行即可。
(5)还可以尝试将Python tests部分删除后重新运行
5.setUp、tearDown执行多次的问题
setUp(连接数据库、打开浏览器等)、tearDown(关闭数据库,关闭浏览器等)这样反复执行,会影响一个网站执行多个用例(多次打开和关闭浏览器,所有用例并没有全部执行完),数据库的话还会增加服务器资源的损耗,且浪费时间。
那么我们可以通过装饰器实现