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(关闭数据库,关闭浏览器等)这样反复执行,会影响一个网站执行多个用例(多次打开和关闭浏览器,所有用例并没有全部执行完),数据库的话还会增加服务器资源的损耗,且浪费时间。

那么我们可以通过装饰器实现

 

posted @ 2023-04-10 10:50  Kangbaz1  阅读(275)  评论(0编辑  收藏  举报