前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >鼠标操作、下拉列表、键盘操作

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

作者头像
清菡
发布2020-12-02 15:54:54
4K0
发布2020-12-02 15:54:54
举报
文章被收录于专栏:清菡软件测试清菡软件测试

文章总览图

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

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

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

常用的非组合键

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


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章总览图
  • 鼠标操作、下拉列表、键盘操作
    • 大家在自己系统中常用的鼠标操作是哪些?
      • 1.悬浮
      • 2.如果想用自动化代码实现这个效果应该怎么做?
      • 3.假设双击之后要拖拽,一连贯的操作过程当中呢,它是这样来实现的:
      • 4.可以通过源码看到它的一些方法和操作流程。按照这个引入方式:
      • 5.原则问题:如果不是万不得已的情况下,就没有必要用鼠标操作。
      • 6.访问百度首页,悬浮到登录按钮。
  • 第一种:鼠标操作。
  • 第二种:点击操作。
    • 验证码的问题
      • 1.想想你们公司的产品为什么要设置验证码?
      • 2.那么,怎么处理这些验证码呢?
  • 下拉框
    • 1.第一种长这样,甚至可能更漂亮的下拉框:
      • 如果我想在这个下拉列表中找到高级搜索,我会怎么做?
      • 一般来说有两种方案
      • 怎么定位这种鼠标悬浮才出现的元素?
      • display: none;隐藏不显示。
      • 根据文本内容来定位:
    • 2.第二种,selenium webdriver当中特意单独拿出来处理的:
      • 对于这种明确标签名是Select的元素,我们有个专门的Select类来处理:
      • select类:
      • 什么是下标?
      • 先引入类:
      • 看看源码:
      • 初始化的第一行代码当中,做了个这样抛异常的判断:
      • 第一个初始化的时候就需要你传入一个Select对象进来,为什么传Select对象,不用传option对象呢?
      • 第一步,找到select元素,把它作为参数存到select类对象当中:
      • 通过这个定位方式来找:
      • 代码
  • 键盘操作
    • 常用组合键
      • 1.有个模块叫做:
      • 2.源码:
      • 3. send_keys()需要传两个参数。
      • 4.看下源码:
      • 5.Keys.ENTER代替搜索按钮。
    • 常用的非组合键
    相关产品与服务
    验证码
    腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档