web端的一些其他稍显复杂的操作元素。
一、模拟鼠标滑动事件:ActionChains
1.1 页面
鼠标滑动到第一个位置:
鼠标又滑动到第二个位置:
页面元素的源码展示:
1.2 代码实践
1.模拟浏览器将鼠标放到目标元素上:
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://www.imooc.com/")
father_element = driver.find_element(By.CLASS_NAME,"menuContent") # 注意:这个父节点,必须是一个元素。
element = father_element.find_elements(By.CLASS_NAME,"item")[1] # 定位方式:层级定位
ActionChains(driver).move_to_element(element).perform() # 模拟浏览器将鼠标放到目标元素上
time.sleep(3)
driver.close()
2.
然后,继续点击Java这个知识点:
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://www.imooc.com/")
time.sleep(3)
element = driver.find_element(By.CLASS_NAME,"menuContent").find_elements(By.CLASS_NAME,"item")[1] # 定位方式:层级定位
ActionChains(driver).move_to_element(element).perform() # 模拟浏览器将鼠标放到目标元素上
time.sleep(5) # 出错。因为类名为lores的元素,不止一个。同时你用的又是find_element
# driver.find_element(By.CLASS_NAME,"lores").find_element(By.LINK_TEXT,"Java").click()
element = driver.find_elements(By.CLASS_NAME,"lores")[1].find_element(By.LINK_TEXT,"Java") # 定位方式:层级定位
element.click()
time.sleep(5)
driver.close()
其中:关于层级定位又有了新的理解:
具体是用find_element还是find_elements,这取决于括号内的实际找到的元素数是一个还是多个(先浏览器控制台查)。
下图的区别就在于,同样是类名查找,上面这个就是能找到一个 元素,下面这个就是找到了多个元素。
3.结果:
成功的将鼠标滑动到“后端开发”按钮上:
并成功的点击了该按钮栏目中的Java这个知识点:
1.3 封装方法
Python语言,优雅,实在是优雅~
1.4 模拟键盘事件:强制刷新,ActionChains
如果打开浏览器,页面没有加载出来,此时需要强制刷新Ctrl+F5
low代码:
# 如果打开浏览器,页面没有加载出来,此时需要强制刷新Ctrl+F5:按住ctrl的同时,发送值F5。然后,松开ctrl。最后,执行提交。
ActionChains(driver).key_down(Keys.CONTROL).send_keys(Keys.F5).key_up(Keys.CONTROL).perform()
封装:
二、富文本:iframe标签内输入内容
不就是一个iframe标签吗?No。
功能测试:只要在富文本框里,鼠标点击一下就能继续输入了。
那么,自动化测试selenium呢?
2.1 问题
上面的”标题“:因为是input标签,所以能够输入;
下面的富文本框:因为里面是p标签,所以不能输入。
2.2 代码实践
先切换到frame富文本对象
再找到p标签,通过ActionChains将鼠标移动到该元素上,然后点击。
在frame里输入完了内容之后,要跳出来。
最后,再去操作页面上其他同等级的元素。
注意:
封装成方法:
2.3 我的实践:p标签上能输入
我并没有通过ActionChains将鼠标移动到该元素上,而是直接在p标签上进行了输入,并且成功:
注意:
实际项目中,可能不止一个iframe,有多层嵌套。
此时,只能一层一层的切入,一层一层的切出。
三、弹窗处理:alert_element = driver.switch_to.alert
点击加入购物车:是模态框,通过web页面的定位就能找到。
这里的弹窗:是系统级别(浏览器级别)的窗口,不能通过上述方式找到。
3.1 3种类型
1.最简单的浏览器弹窗:只有一个确定按钮:
2.选择性的浏览器弹窗:确定、取消按钮
3.输入性的浏览器弹窗:输入、确定、取消按钮
网页HTML源码分析:
- 上述的弹窗,均是input标签,类型是button;
- 且,绑定了一个鼠标点击事件,会启动一个js函数。
3.2 代码实践
1.浏览器弹窗:只有一个确定按钮:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('file:///C:/Users/KYB/Desktop/test.html')
time.sleep(2)
driver.find_element(By.ID,'alert').click() # 点击这个按钮元素,出现弹窗
time.sleep(2)
driver.switch_to.alert.accept() # 将浏览器切换到该弹窗,并接受
time.sleep(2)
driver.close()
2.选择性的浏览器弹窗:确定、取消按钮
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('file:///C:/Users/KYB/Desktop/test.html')
time.sleep(2)
driver.find_element(By.ID,'sure').click() # 点击这个按钮元素
time.sleep(2)
driver.switch_to.alert.accept() # 将浏览器切换到该弹窗元素,并接受
time.sleep(2)
driver.refresh()
time.sleep(2)
driver.find_element_by_id('sure').click() # 点击这个按钮元素
time.sleep(2)
driver.switch_to.alert.dismiss() # 将浏览器切换到该弹窗元素,并取消
time.sleep(2)
driver.refresh()
driver.close()
3.输入性的浏览器弹窗:输入、确定、取消按钮
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('file:///C:/Users/KYB/Desktop/test.html')
time.sleep(2)
driver.find_element_by_id('three').click() # 点击这个按钮元素
time.sleep(1)
alert_element = driver.switch_to.alert # 将浏览器切换到该弹窗元素
print(alert_element.text)
alert_element.send_keys('test') # 对该弹窗元素,输入值
alert_element.accept() # 并确认
time.sleep(2)
driver.close()
学习演示时,用的多是time.sleep()。
但是,实际项目中,不能这么用。
3.3 封装方法
将上述的三种弹窗的处理逻辑,封装到一个方法中:
具体逻辑流程如下:
四、滚动条:通过循环执行js代码,来模拟滑动
有的web页面,不是一下子就全部加载出来,而是你往下拉一点,然后加载一点,往下拉一点,再加载一点。
如果是按照以往的直接查找定位元素,是定位不到的。
4.1 页面显示
浏览器的控制台里控制滚动条:
- 去往视屏最底部;
- 去往视屏最顶部;
网页HTML源码:每一本书都是一个li标签。
4.2 代码实践
根据这个页面来定位元素:
因为通过clearfix类名,定位到的元素列表不准确。除了整个li标签内的内容,还有红框下面的加个标签。
所以,循环该元素列表出错。
代码 :
一屏一屏的加载:
通过滚动条的设置,成功的定位了该书,并进行了点击。也跳转到了别的页面:
4.3 封装方法:适合本案例
4.4 更通用的封装方法
目的:查找页面上的目标元素。进入到了第一屏,如果刚好能找到,那就拿到目标元素,循环终止;如果没找到,那就执行js代码进入到第二屏。循环上述过程。
五、登录信息
我认为,没啥实际用途。
种植cookie等。
六、处理截图
上述所有的selenium的元素操作,会发现:有时会出错。
有的是因为定位没找到,有的是因为网络打开慢了会出错。
功能测试:一般是截屏,保留现场。使用QQ的截图按钮;Ctrl+Alt+A
自动化测试呢?
6.1 初步的截图
已成功的截图
6.2 截图:能够修改图片名字
1.
源码:
2.
实际项目中,文件命名:case名字+时间戳
这里没有case名字,所以只用了时间戳:年月日.时.分.秒
6.3 封装方法
def save_png(self):
now_time = time.strftime("%Y%m%d.%H.%M.%S")
self.driver.get_screenshot_as_file('%s.png' %now_time)
Comments | NOTHING