文章总览图
鼠标操作、下拉列表、键盘操作
大家在自己系统中常用的鼠标操作是哪些?
1.悬浮
鼠标放在设置这里,在这个下拉列表中选一个高级搜索,在这个里面做一些搜索操作。
2.如果想用自动化代码实现这个效果应该怎么做?
首先了解鼠标操作这个东西是怎么实现的,用了一个类,这个类叫做actionChains
ActionChains
中专门用来完成模拟鼠标的操作。
perform()
的作用和它的实现原理有关,有的时候用鼠标不仅是想做一个操作,可能是几个操作连起来的。
3.假设双击之后要拖拽,一连贯的操作过程当中呢,它是这样来实现的:
先要把你所有的操作放在一个列表当中,实际上,每一个操作都是由我们的http请求发送出去,然后由我们的chromedriver驱动浏览器去执行的。
如果你的鼠标是连续性的操作,先把它放在一个列表当中,然后我们的perform()
方法就去将列表当中所有的行为,所有的鼠标操作,一次性去执行它,连续执行,连续发送多条命令,所以是这种方式。
4.可以通过源码看到它的一些方法和操作流程。按照这个引入方式:
from selenium.webdriver.common.action_chains import ActionChains
5.原则问题:如果不是万不得已的情况下,就没有必要用鼠标操作。
相对于鼠标操作来说,点击输入等其它操作是比鼠标操作要更稳定的。
如果在你的系统当中,鼠标悬浮操作,你能够通过点击操作去实现的话,就用点击也没关系。
例如这个地方点击下设置,同样也可以让这个下拉列表在这里的。
如果能用别的方式代替就尽量不用鼠标,鼠标操作相对来说不是特别稳定的。
6.访问百度首页,悬浮到登录按钮。
1.先找到这个元素。
2.实例化ActionChains
类
ActionChains(driver)
初始化的参数是当前浏览器会话对象。
第一种:鼠标操作。
代码语言:javascript复制from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#启动谷歌浏览器,开启与浏览器之间的会话。
driver=webdriver.Chrome(service_log_path="D://chromedriver_service.log")
driver.maximize_window()
# 全局等待--隐性等待
# driver.implicitly_wait(30)
#访问网页
driver.get("http://www.baidu.com")
#1.先找到鼠标要操作的元素
ele=driver.find_element_by_xpath('//*[@id="u1"]//a[@name="tj_settingicon"]')
# 2.实例化ActionChains类
ac=ActionChains(driver)
# 3.将鼠标操作添加到actions列表中
ac.move_to_element(ele)
# 4.调用perform()来执行鼠标操作
ac.perform()
#
# ActionChains(driver).move_to_element(ele).perform()
第二种:点击操作。
如果是别的操作能够代替鼠标操作,就不一定非要用鼠标操作不可。
实际上我去点击的时候,我的鼠标焦点已经在这个元素上面。
直接用click()
来实现。
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#启动谷歌浏览器,开启与浏览器之间的会话。
driver=webdriver.Chrome(service_log_path="D://chromedriver_service.log")
driver.maximize_window()
# 全局等待--隐性等待
# driver.implicitly_wait(30)
#访问网页
driver.get("http://www.baidu.com")
#1.先找到鼠标要操作的元素
ele=driver.find_element_by_xpath('//*[@id="u1"]//a[@name="tj_settingicon"]')
ele.click()
验证码的问题
写用例的时候,遇到系统有验证码,怎么办?怎么搞定这个验证码?
1.想想你们公司的产品为什么要设置验证码?
12306抢票为什么要设置验证码?一些图片验证码,它是为了防止机器大量的高频率的访问我的服务器,如果大家都没有设置门槛,有人想恶意的高频率高压力的去访问公司的服务器,那它就很有可能崩溃了。如果不设置门槛,用代码访问一千次一万次也都能登录成功。
阻止机器如此大量的对我的服务器造成压力,浪费我的资源。机器识别这个问题有时候还限制一分钟之内只能登录多少次,即便你多个登录成功,它也会限制次数的,验证码的目的是防止机器自动的去做一系列事情。
现在做自动化测试,也是机器自动地去做一些事情,验证码其实也是防我们做的这些自动化。
2.那么,怎么处理这些验证码呢?
如果是自己公司的产品,我们做自动化的目标是系统里面的核心功能,我是要做回归测试的,不是为了这个验证码,但是会因为这个验证码卡在这,走不下去,进不去这个系统。
有很多的产品,它的验证码的方式是不一样的,Python也有第三方的库可以识别图片等等,它的识别率也不是百分百,也是各种随机处理的。要的是跳过这个验证码,直奔我的核心内容就行。
可以让开发屏蔽验证码,如果怕上线的时候忘记关闭屏蔽验证码,那么可以让开发搞个固定的验证码,随便什么样的验证码,只要你输入这个东西就可以了。
如果开发不配合,就找他们领导反映这件事,但是大部分开发哥哥人都是很好的,哈哈。
下拉框
下拉框在我们的系统当中会有两种形式。
下拉框在我们的系统中有两种形式。
1.第一种长这样,甚至可能更漂亮的下拉框:
是鼠标悬浮的形式的。
如果我想在这个下拉列表中找到高级搜索,我会怎么做?
在这个下拉框中找到高级搜索并点击。
先让下拉列表弹出来,弹出来之后,定位高级搜索,然后点击。
像这样的下拉列表有好几个元素,有点像我们的菜单形式。
一般来说有两种方案
第一种:定位高级搜索,根据菜单的文本内容直接定位它,然后去点击它。
第二种,获取下拉列表中所有的元素,然后通过for循环去匹配对应的文本内容,匹配到之后再去点击这样的元素。
如果遇到下拉列表的内容比较多,如果下拉列表元素比较多,就采用第一种。
如果你获取所有的下拉列表值,再去通过for循环定位,万一你要找的元素在列表的最后,这就要花费一些时间了。
一般来说都是第一种,根据文本内容来定位。
怎么定位这种鼠标悬浮才出现的元素?
定位这种鼠标悬浮才出现的元素:windows10和windows7都可以。
鼠标焦点必须在Elements区域,任何元素都可以。
然后按住快捷键ctrl shift c之后,按着不动,将你的鼠标移动到下拉列表中,把鼠标放在你要定位的元素上。
鼠标还在你需要定位的元素上不要动,然后松开你的ctrl shift c,三个键同时松开。
C
如图:你就能看到这样一个东西在这里,点击一下,你可以在这里看到它的所有定位了。
遇到这种情况,全部都可以用按住快捷键ctrl shift c这种方式来定位。
display: none;
隐藏不显示。
根据文本内容来定位:
根据文本内容定位-点击。是用鼠标让这个下拉列表出现,这是第一种下拉列表处理方式:
代码语言:javascript复制from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#启动谷歌浏览器,开启与浏览器之间的会话。
driver=webdriver.Chrome(service_log_path="D://chromedriver_service.log")
driver.maximize_window()
# 全局等待--隐性等待
# driver.implicitly_wait(30)
#访问网页
driver.get("http://www.baidu.com")
#1.先找到鼠标要操作的元素
ele=driver.find_element_by_xpath('//*[@id="u1"]//a[@name="tj_settingicon"]')
# ele.click()
# 2.实例化ActionChains类
# ac=ActionChains(driver)
#
# # 3.将鼠标操作添加到actions列表中
# ac.move_to_element(ele)
#
# # 4.调用perform()来执行鼠标操作
# ac.perform()
#
ActionChains(driver).move_to_element(ele).perform()
# 选择下拉列表当中的高级搜索
WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[text()="高级搜索"]')))
driver.find_element_by_xpath('//a[text()="高级搜索"]').click()
2.第二种,selenium webdriver当中特意单独拿出来处理的:
这种是原生的webdriver html页面里面的一些内容,遇到这种元素,先来定位一下它:
对于这种明确标签名是Select的元素,我们有个专门的Select类来处理:
刚刚这个下拉列表中,首先让这个下拉列表出现,然后再去处理其中的选项。
但是用了这个Select类,就不需要等到它出现。
select类:
在这个类当中,它有3种选值方式,通过下标,value值和文本内容。
什么是下标?
找到select这个元素之后,就一定知道它旗下有多少个选项。下标就是从第一个选项开始,下标是从0开始,0就是第一个。
如果有value属性,我们就用value属性。
三种选择方式,有选择方式就有不选的方式。不选的方式和选择的方式是一样的。一般来说用这个库,基本上是用来选择。
先引入类:
from selenium.webdriver.support.ui import Select
这个类只处理select元素,其它的元素不处理。
看看源码:
首先看看初始化,因为我们要用,不明白初始化就不会传参,不会用。在初始化当中,这个参数是webelement
初始化的第一行代码当中,做了个这样抛异常的判断:
这个抛异常判断的意思是:
如果标签名不为select,忽略大小写。
大小写无所谓,标签名不是select就抛异常。
异常当中,select只工作在select元素上,所以明确告诉你它的作用。
第一个初始化的时候就需要你传入一个Select对象进来,为什么传Select对象,不用传option对象呢?
因为它知道Select元素,它旗下有什么option,它自己有办法获取到,所以只要Select就可以了。
@property
表示这个东西是个属性。
它的说明中返回了一个所有options,options是Select的子元素。
这是源码:通过它的标签名称,标签名称是option,这个options选项,返回的是所有的选项对象,并且是个列表。
代码语言:javascript复制def options(self):
"""Returns a list of all options belonging to this select tag"""
return self._el.find_elements(By.TAG_NAME, 'option')
find_elements
就是指返回结果为列表。
这是源码:这个属性返回所有选中的选项。
代码语言:javascript复制 def all_selected_options(self):
"""Returns a list of all selected options belonging to this select tag"""
ret = []
for opt in self.options:
if opt.is_selected():
ret.append(opt)
return ret
这是源码:这个返回第一个选中的,或者说目前正在选中的这个元素。
代码语言:javascript复制 def first_selected_option(self):
"""The first selected option in this select tag (or the currently selected option in a
normal select)"""
for opt in self.options:
if opt.is_selected():
return opt
raise NoSuchElementException("No options are selected")
3种选元素的模式。value是value属性。一定要有这个value属性,没有它就不能用这个方法。
通过下标,index的option的下标从0开始。
通过文本内容来选。这里面通过xpath:
自己写了个xpath表达式,然后跟着你传进来的文本内容做了个替换。
表示都不选。不选中方式也有3种。
click操作导致了高级搜索选项出来了,正好到了这个页面。
第一步,找到select元素,把它作为参数存到select类对象当中:
找到一个,1 of 1
通过这个定位方式来找:
手工操作的时候,点击一下,等所有的下拉列表出现,然后再选,但是我们这个地方不需要。
默认的肯定是第一个,“所有网页和文件”
代码
代码语言:javascript复制from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#启动谷歌浏览器,开启与浏览器之间的会话。
driver=webdriver.Chrome(service_log_path="D://chromedriver_service.log")
driver.maximize_window()
# 全局等待--隐性等待
# driver.implicitly_wait(30)
#访问网页
driver.get("http://www.baidu.com")
#1.先找到鼠标要操作的元素
ele=driver.find_element_by_xpath('//*[@id="u1"]//a[@name="tj_settingicon"]')
# ele.click()
# 2.实例化ActionChains类
# ac=ActionChains(driver)
#
# # 3.将鼠标操作添加到actions列表中
# ac.move_to_element(ele)
#
# # 4.调用perform()来执行鼠标操作
# ac.perform()
#让下拉列表显示出来
ActionChains(driver).move_to_element(ele).perform()
# 选择下拉列表当中的高级搜索
WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[text()="高级搜索"]')))
driver.find_element_by_xpath('//a[text()="高级搜索"]').click()
# select类
from selenium.webdriver.support.ui import Select
#1、找到select元素
# 因为点击导致了新的东西出现,所以要加上等待
WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//select[@name="ft"]')))
select_ele=driver.find_element_by_xpath('//select[@name="ft"]')
# 2、实例化select类
s=Select(select_ele)
# 3、选择下拉列表值
# 方式一:下标 从0开始
s.select_by_index(4)
#方式二:通过value值来选
s.select_by_value("all")
#方式三:文本内容
s.select_by_visible_text('Adobe Acrobat PDF (.pdf)')
运行以上代码,切换的比较快,没有看到下拉列表出现,没有看到选项,但是都选好了。这个就是针对select选项选择处理。
视频:
这是我们的下拉列表,两种方式都经历了一下。一种是鼠标,一种是select类的。
键盘操作
常用组合键
如果想输入组合键,比如ctrl c,ctrl v,ctrl f等等,像这样的组合键,都可以使用send_keys()
。
1.有个模块叫做:
from selenium.webdriver.common.keys import Keys
在这个模块文件中,定义了所有的键值。
2.源码:
代码语言:javascript复制CONTROL = 'ue009' 右边的control键
LEFT_CONTROL = CONTROL 左边的control键
ALT = 'ue00a' 右边的alt键
LEFT_ALT = ALT 左边的alt键
3. send_keys()
需要传两个参数。
4.看下源码:
表示可以传多个值,组合键就是这样来的。
5.Keys.ENTER
代替搜索按钮。
比如我在百度,输入框中输入“测试”,直接按enter键就可以搜索得出来,不一定非要点击百度一下。
代码语言:javascript复制from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#启动谷歌浏览器,开启与浏览器之间的会话。
driver=webdriver.Chrome(service_log_path="D://chromedriver_service.log")
driver.maximize_window()
driver.find_element_by_xpath("").send_keys(Keys.ENTER,"a")
常用的非组合键
键盘操作的使用率不是特别高。