08 第八章 鼠标滑动、富文本输入、弹窗转换、滚动条下滑、保存截图



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)

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 08 第八章 鼠标滑动、富文本输入、弹窗转换、滚动条下滑、保存截图


Follow excellence, and success will chase you.