鼠标操作、下拉列表、键盘操作

2020-12-02 15:54:54 浏览数 (1)

文章总览图

鼠标操作、下拉列表、键盘操作

大家在自己系统中常用的鼠标操作是哪些?

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()来实现。

代码语言: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()

验证码的问题

写用例的时候,遇到系统有验证码,怎么办?怎么搞定这个验证码?

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")

常用的非组合键

键盘操作的使用率不是特别高。


0 人点赞