selenium

  • 什么是selenium?
  • selenium1.0
  • selenium 2.0
    • webdriver的原理
  • selenium 3.0
    • 安装python和selenuim 环境安装注意事项
  • wbdriver的API学习
    • 定位元素的方式
    • 操作测试对象
    • 等待
    • 打印信息
    • 浏览器的操作
    • 键盘事件
    • 鼠标事件
    • 定位一组元素
    • 多层框架的定位
    • alert confirm prompt的处理
      • alert使用规则
    • 层级定位
    • 下拉框定位
    • 上传文件

什么是selenium?

Selenium是ThroughtWorks公司一个强大的开源Web功能测试工具系列,支持多平台、多浏览器、多语言去实现自
动化测试。是一个工具集合 从 selenium1.0发展到 selenium 2.0到现在的3.0,下面会具体进行介绍。
Selenium2将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,甚至操作浏览
器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),所以就像真正的用户在操作一样。

selenium1.0

selenium1.0 thoughtworks公司常常使用
selenium 1.0 包含内容

  • selenium IDE 自动化脚本录制工具
  • selenium GRID 分布式测试
  • selenium RC selenium RC (Remote Control Server)的工作原理


图解:


(1)客户驱动与selenium RC Server之间建立起一个链接。

(2)Selenium RC Server 启动浏览器,并在浏览器加载页面中注入了Selenium Core 的javaScript

(3)客户端驱动给Server传递一条Selenese命令

(4)客户端驱动各个Server解释命令,并触发对应的javaScript在浏览器中执行。

(5)Selenium Core指示浏览器执行第一条指令,例如打开一个待测系统页面。

(6)浏览器接收到打开请求后,向Selenium RC Server(作为浏览器的HTTP代理),要求web站点内容。

(7)Selenium RC Server与web服务器通信,请求页面,并且一旦收到响应就将页面传递给浏览器,但它会篡改源,是页面看上去好像来自于与selenium Core同源的服务器。

(8)浏览器接收到web页面后,就在保留的框架\窗口中展示页面。

同源规则:selenium面临的限制就是同源规则,每一个浏览器都应用列同源的规则,导致selenium必须对这个规则找出对应的解决办法。解决的策略就是使用代理注入Http Proxy ,但是还有其他的,这里暂时一说 提高浏览器的权限

何为同源:相同的协议,端口、域名

其目的是确保一个站点的内容不会被另一个站点的脚本所访问。同源规则专注于确保浏览器加载的任何代码,都只能在同一站点内部进行操作。假如你在一个浏览器的一个选项卡内打开了一个网上银行的页面(www.yinhang.com)。又在另选项卡上不小心打开了一个挂马的页面(www.guama.com),那么挂马的页面是不能操作网上银行页面的内容,因为引入了同源规则。所以,他们不能相互作用。如果不引入同源规则,后果很严重。

selenium 2.0

selenium1.0 + webdriver

webdriver的原理

是浏览器的驱动,根据不同的浏览器定制,绕过了javaScript的环境沙箱问题。到底什么是环境沙箱问题不做细究了…
webdriver (浏览器驱动,根据不同的浏览器定制)就可以解决这个问题
它本身是一个.exe的文件

selenium 3.0

增加了 Edge 和 Safari的原生驱动

安装python和selenuim 环境安装注意事项

  1. 安装python
  • 安装python环境 勾选将python添加至环境变量
  • cmd python 出现python版本号
  1. 安装pycharm
  • 配置解释器 file - setting-project- project interpreter 添加使用当前python版本的环境来解释文件 配置的是python路径下的 python.exe
  1. 安装浏览器驱动
  • 查看浏览器的版本号 下载对应版本号的驱动
    浏览器驱动的镜像文件下载网址

wbdriver的API学习

导图一览

定位元素的方式

对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人。那么一个对象也有类似的属性,我们可以通过这个属性找到这对象。注意:不管用那种方式,必须保证页面上该属性的唯一

  • id 全局唯一 肯定可以定位到一个元素
  • xpath 一定可以定位到一个元素 即使没有id name等等
  • css_selector

以下的不一定是全局唯一的,很可能定位不到

  • name
  • class name
  • link_text(有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link)
  • partial_link_text(通过部分链接定位,可以通过链接的一部分文字定位 )
  • tag_name

操作测试对象

  • click 点击对象
  • send_keys 在对象上模拟按键的输入
  • clear 清除对象的内容,如果可以的话
  • submit提交对象的内容 如果可以的话
  • text 用于获取元素的文本信息(这里是做什么的?)
# 元素的定位的学习
# 一个元素有很多的属性,可以根据这些不同的属性来学习# 导入驱动包from selenium import webdriver
# from datetime import time
import time# 获取驱动 定义了变量 但是变量没有具体的类型
driver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url) # 打开浏览器# 用id 来定位百度搜索框 id是全局唯一 所以在同一个页面里面不可能都相同的id元素
# driver.find_element_by_id("kw").send_keys("高飞")
# 定位百度一下这个按钮 用id定位
# driver.find_element_by_id("su").click()
# 使用前提必须保证class是全局唯一的
# driver.find_element_by_class_name("btn self-btn bg s_btn btn_h btnhover").click()# 使用link-text定位 没有 id name
# driver.find_element_by_link_text("新闻").click()# 使用 partial-link_text 来定位元素
# driver.find_element_by_partial_link_text("hao").click()# 使用tag_name定位  必须保证全局唯一
# driver.find_element_by_tag_name("input").send_keys("高飞")
# driver.find_element_by_tag_name("input").click()# 使用xpath 来定位 xpath里面双引号的内容替换为单引号即可
# 如果没有显示的展现出来id name 等等的属性 那么可以xpath 确定xml语言文档中某部分的位置
# driver.find_element_by_xpath("//*[@id='kw']").send_keys("解淇茹")
# driver.find_element_by_xpath("//*[@id='su'']").click()# 用css selector来定位
# driver.find_element_by_css_selector("#kw").send_keys("BAT")
# driver.find_element_by_css_selector("#su").click()
# time.sleep(6)# 清除输入框的内容 clear
# driver.find_element_by_css_selector("#kw").clear()
# driver.find_element_by_css_selector("#kw").send_keys("觉醒年代")
# driver.find_element_by_css_selector("#su").click()# sumbit 提交  如果元素的type是submit 那么可以使用submit代替click来做
#submit()方法用于提交表单。有时候submit()可以与click()方法互换来使用
# driver.find_element_by_css_selector("#su").submit()# text获取文本内容
text = driver.find_element_by_id("s-top-left").text
print(text)# 等待反应
time.sleep(5) # 固定等待的时间
# 关闭浏览器
driver.quit()    #在关闭浏览器的同时清理一些缓存和一些无效的数据
# driver.close()   #仅仅是关闭浏览器的框框

等待

  • 固定等待 time.sleep(秒数)
  • 智能等待 driver.implicity_wait(秒数)
    智能等待是在上一个已经打开的页面上需要继续检索需要的内容的时候
    智能等待表示的是在这个时间里面,一旦页面的元素加载完成,那么即使时间没有用完,也不会继续等待下去了。
from selenium import webdriver
import time# 学习固定等待和智能等待driver = webdriver.Chrome()  # 获取浏览器的驱动
url = "https://www.baidu.com/"
driver.get(url)  # 打开浏览器driver.find_element_by_id("kw").send_keys("张杰")
driver.find_element_by_id("su").submit()# 固定等待
# 在已经打开的页面上继续检索需要的内容的时候
# 是需要进行一个页面的加载过程的
# 这个过程需要一个等待的时间 可以使用固定的等待时间 也可以使用智能等待时间
# 如果不进行一个等待的内容缓存,是会抛出异常,说无法定位到这个元素# time.sleep(5)  # 固定等待 这个很重要
driver.implicitly_wait(5)  # 智能等待driver.find_element_by_link_text("张杰(中国流行男歌手) - 百度百科").click()
#这里用固定等待就好啦,因为是用户要浏览对应内容time.sleep(6)
#driver.implicitly_wait(5)# driver.close()  # 如果使用close 发现只关闭了第一个搜索网页 而没有关闭百度百科的网页
driver.quit()

打印信息

  • current_url()
  • tittle

浏览器的操作

  • browser.maxmize_window() 浏览器最大化
  • browser.set_window_size(480,800) 设置浏览器的宽480,高800显示
  • browser.back() 浏览器的后退
  • browser.forward() 浏览器的前进 要和sleep结合才可以看到现象
  • browser.window_handles 获取当前所有打开窗口的句柄返回值是一个list 列表 (在下面和 多层框架定位切换窗口一起演示)
  • js = “var q=document.documentElement.scrollTop = 10000”
    driver.execute_script(js)
    通过执行javaScript语句达到控制滚动条的效果
# 设置浏览器的大小  最大化 宽和高
# 控制浏览器的前进和后退from selenium import webdriver
import timedriver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)# 浏览器的最大化
driver.maximize_window()
time.sleep(3)
driver.set_window_size(480,800)   # 设置浏览器的宽 高driver.find_element_by_id("kw").send_keys("张杰")
driver.find_element_by_id("su").submit()
time.sleep(3)# 这里使用的等待只能是固定等待
time.sleep(6)   # sleep 里面需要一个参数 sleep() takes exactly one argument (0 given)title = driver.title
url = driver.current_url
print(title)
print(url)# 为什么这个前进和后退的语句放的位置还是由限制的
# 看不到现象没有sleep的原因
# 浏览器的后退
driver.back()
time.sleep(3)
title = driver.title
url = driver.current_url
print(title) # 百度一下,你就知道
print(url)# 浏览器的前进
driver.forward()
time.sleep(3)
driver.quit()
# 浏览器的滚动条
from selenium import webdriver
import timedriver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)
driver.maximize_window()
time.sleep(1)
driver.set_window_size(800, 600)kw = driver.find_element_by_id("kw")
kw.send_keys("张杰")
driver.find_element_by_id("su").submit()time.sleep(3) # 这里必须要time 否则看不到滚动条的效果
# 拉动到最下方
js1 = "var q=document.documentElement.scrollTop = 10000"
driver.execute_script(js1)
time.sleep(3)
# 拉动到最上方
js2 = "var q= document.documentElement.scrollTop = 0"
driver.execute_script(js2)
time.sleep(3)
driver.quit()

键盘事件

需要引入key包

  • send_keys(Keys.TAB) 使用tab键
  • send_keys(Keys.ENTER) 回车

使用Keys.TAB示例,有的时候用户会使用键盘进行焦点的切换,比如使用tab键进行一个切换到输入密码的操作,但是即使定位到密码框当再次输入密码的时候还是需要再次定位。
同时用户的习惯是输入密码的时候会按下会回车提交表单,也可以模拟

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keysdriver = webdriver.Chrome()
url = "http://127.0.0.1:88/zentao/user-login.html"
driver.get(url)account = driver.find_element_by_name("account")
account.send_keys("admin")
# password = driver.find_element_by_name("password")
# password.send_keys("xqr13467289102")
# 模拟tab键 来进行焦点的切换 切换到密码
account.send_keys(Keys.TAB) # 这里相当于就是模拟tab
time.sleep(3)
# 即使tab键已经定位到了密码框,但是再次输入密码的时候,还是需要焦点的切换
driver.find_element_by_name("password").send_keys("x**13**72*****")# 表单的使用可以submit 也可以使用click#driver.find_element_by_id("submit").click()
# driver.find_element_by_id("submit").submit()  # 为什么不可以
# 一个解释是 form 表单中有 name='submit'  导致js  不认识submit(),
# 表单的id 为submit的时候为什么无法进行submit
# button的id不要设置为submit,否则可能会引起混淆,导致表单的submit()方法不能提交表单。
# 在命名ID时,名字最好不要和现有的api在名称上重复,避免不必要的烦扰。
#  发现 submit已经变成 form 的一个属性了,并不是方法。
#  把submit(也就是submit方法)覆盖了。所以要注意提交表单name的命名方式不要和form原有的方法,属性相同,这样会导致原来的form属性方法失效。# 如果不使用click 也可以使用enter
# 定位到密码的框  模拟使用enter键进行一个表单的提交 模拟用户输入密码之后按下回车
driver.find_element_by_name("password").send_keys(Keys.ENTER)# 也可以通过定位到login 来提交表单
# driver.find_element_by_id("submit").send_keys(Keys.ENTER)time.sleep(3)
driver.quit()time.sleep(3)
driver.quit()
  • send_keys(Keys.CONTROL,‘a’) 全选
  • send_keys(Keys.CONTROL, ‘x’) 剪切
  • send_keys(Keys.CONTROL,‘v’) 粘贴
  • send_keys(Keys.CONTROL, ‘c’) 复制
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keysdriver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)
driver.maximize_window()
time.sleep(1)
driver.set_window_size(800, 600)kw = driver.find_element_by_id("kw")
kw.send_keys("张杰")
driver.find_element_by_id("su").submit()time.sleep(3) # 这里必须要time 否则看不到滚动条的效果
# 模仿用户浏览
js1 = "var q=document.documentElement.scrollTop = 10000"
driver.execute_script(js1)
time.sleep(3)
js2 = "var q= document.documentElement.scrollTop = 0"
driver.execute_script(js2)
time.sleep(3)# 全选输入框中的内容 剪切之后 重新输入一个内容
kw.send_keys(Keys.CONTROL, 'a')
time.sleep(2)
kw.send_keys(Keys.CONTROL, 'x')
time.sleep(2)
kw.send_keys("谢娜")
driver.find_element_by_id("su").submit()
# 之前剪切的张杰再次输入到文本框中,但没有进行搜索
kw.send_keys(Keys.CONTROL,'v');time.sleep(3)
driver.quit()

鼠标事件

ActionChains 类

  • context_click() 右击
  • double_click() 双击
  • drag_and_drop 拖动 这个对拖动滑块来验证通过
  • move_to_element () 移动
# 鼠标事件
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)kw = driver.find_element_by_id("kw")
kw.send_keys("张杰")
su = driver.find_element_by_id("su")
su.submit()
time.sleep(2)# 模拟鼠标的右击事件# 内置参数 需要知道操纵的是哪一个浏览器  context_click 右击事件
# perform 是执行的意思
# 也就是 操纵的是driver对应获取的浏览器  然后对提交的按钮进行右击事件 执行这个事件
# 这里使用鼠标的定位点击提交代替定位元素的提交
ActionChains(driver).context_click(su).perform()# 更改文本框的内容 然后双击元素
kw.send_keys(Keys.CONTROL,'a')
time.sleep(1)
kw.send_keys(Keys.CONTROL,'x')
time.sleep(1)kw.send_keys("谢娜")
ActionChains(driver).double_click(su).perform()time.sleep(3)# 定位这个新闻链接 然后对应的移动鼠标 对应的网页文字下面会出现下划线
# 注意检索之前 一定要进行一个等待的时间
# 下面这里可能会检索不到 对应的更换就好啦
find = driver.find_element_by_link_text("谢娜被曝生二胎后,首次喊话张杰庆祝父亲节,一家...")
ActionChains(driver).move_to_element(find).perform()
time.sleep(6)driver.quit()

定位一组元素

webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。(避免频繁的定位导致代码冗余)
定位一组对象一般用于以下场景:
批量操作对象,比如将页面上所有的checkbox 都勾上

  • get_attribute 获取属性值

  • find_element_by_tag_name 找到这一组元素

  • os.path.abspath 打开本地的文件 使用系统函数os 使用绝对路径

  • file = “file:///” + os.path.abspath("***") 前缀file:/// 是浏览器打开本地的html的固定前缀

# 定位一组元素 将一组元素都打上勾勾
from selenium import webdriver
import os
import timedriver = webdriver.Chrome()
# 打开本地的文件 使用系统函数os
# 这个前缀file:///  是浏览器打开本地的html的固定前缀
file = "file:///" + os.path.abspath("***")driver.get(file)
driver.maximize_window()
time.sleep(1)# 代码冗余
# driver.find_element_by_id("c1").click()
# driver.find_element_by_id("c2").click()
# driver.find_element_by_id("c3").click()# 找出所有 tag name是input类型的 构成了一个数组
# 注意这里写的是elements
inputs = driver.find_elements_by_tag_name("input")
# 从这个数组的元素中找出 type = CheckBox
for input in inputs:if input.get_attribute('type') == 'checkbox':input.click()time.sleep(2)
driver.quit()

多层框架的定位

对于一个现代的web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一
个难题。有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中,seelnium webdriver 提供了一个switch_to_frame 方法,可以很轻松的来解决这个问题。
switch_to_frame(name_or_id_or_frame_element):
如果这个frame有name和id属性那么就用这两个属性就好,如果没有的话可以先用
find_element_by_xxx方法找到这个frame元素,然后把这个元素传进去,这也是可行的。

switch_to_frame()把当前定位的主体切换了frame里。怎么理解这句话呢?我们可以从frame的实质去理解。
frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此才需要用switch_to_frame方法去获取frame中嵌入的页面,对那个页面里的元素进行定位。

  • switch_to_frame()
  • switch_to_window()
  • switch_to.default_content() 回到默认的页面去 )(是不支持从里到外一层层的定位返回)从frame中嵌入的页面里跳出,跳回到最外面的原始页面中。
  • switc_to.window(参数)

整个页面的布局是 html 里面嵌套 frame 在嵌套html 里面再frame

第一层frame

第二层frame

# 多层框架和窗口的定位
from selenium import webdriver
import time
import osdriver = webdriver.Chrome()
file = "file:///" + os.path.abspath("***")
driver.get(file)
driver.maximize_window()# 想要做到的事情是在 内层的frame里面进行文本搜索
# 整个页面的布局是 html 里面嵌套 frame 在嵌套html 里面再frame# 但是首先需要切换到内层的页面 最外面的页面是没有百度搜索输入框的
# 切换层级  由于是一层套一层的
driver.switch_to.frame("f1")
driver.switch_to.frame("f2")
# 最简单的做法  由于不管前端的框架是如何做到一层层的套 id是不会改变的
driver.find_element_by_id("kw").send_keys("张杰")
driver.find_element_by_id("su").submit()time.sleep(2)
# 定位到网页写的click的弹出框 可以发现click是在f1中的
# 那么是否可以再次又内层跳到外层来定位呢? -- 不可以
# 只能回到默认的页面去定位 再去定位到f1
driver.switch_to.default_content()
driver.switch_to.frame("f1")
driver.find_element_by_link_text("click").click()
# 如果出现了alert弹出框那么说明定位成功了time.sleep(2)
driver.quit()

switc_to.window() 演示

如果因为自动化脚本由操作一个页面的元素而弹出了另一个页面,那么需要转到对第二个页面操作,就需要用到这个api。
下面用自己项目做的自动化测试踩的坑做示例
第一个页面是主要操作的页面,后来弹出来第二个新增博客的页面,如果需要对第二个页面进行操作,那么就需要切换窗口的操作句柄。

from selenium import webdriver
import timefrom selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Chrome()
url = "http://localhost:8080/2021/view/login.html"
driver.get(url)# 模拟用户登录driver.find_element_by_id("login_info").find_element_by_id("username").send_keys("*")driver.find_element_by_id("login_info").find_element_by_id("password").send_keys("*")driver.find_element_by_id("login_info").find_element_by_xpath("//*[@id='login_info']/input[3]").submit()
time.sleep(3)# 发表新文章driver.find_element_by_id("article_add_btn").click()
time.sleep(3)# 获取当前所有打开窗口的句柄 返回的是一个列表
handles = driver.window_handles
print("所有窗口的句柄:", handles)# 切换到第二个窗口
driver.switch_to.window(handles[1])# 在切换回第一个窗口
driver.switch_to.window(handels[0])

alert confirm prompt的处理

  • text返回 alert、confrim、prompt 中的文字信息
  • accept 点击确认按钮
  • dismiss 点击取消按钮 如果有的话
  • send_keys 输入值 这个 alert、confrim 没有对话框就不能用了,不然会报错。

alert使用规则

  • 获取操作句柄 alert = driver.switch_to.alert
  • 对弹出框进行操作 alert.accept()
    • accept 点击确认按钮
    • dismiss 点击取消按钮 如果有的话
    • send_keys 输入值 这个 alert、confrim 没有对话框就不能用了,不然会报错。

accept 演示

# alert 事件
from selenium import webdriver
import time
import osfrom selenium.webdriver.common.alert import Alertdriver = webdriver.Chrome()
file = "file:///" + os.path.abspath("**")
driver.get(file)
driver.maximize_window()driver.find_element_by_id("tooltip").click()time.sleep(3)
# 关闭alert的弹框# 第一步 得到了操作弹框的句柄
alert = driver.switch_to.alert
print(alert.text) # text 获取alert的信息
# 第二步 关闭弹框
alert.accept()  # 表示点击确定按钮time.sleep(2)
driver.quit()

send_keys演示

# alert 事件中如果弹出的对话框 是一个要求输入内容的东西、
# 那么做法和思路原理都是
# 首先获取操作的句柄 然后在里面send——keys即可
from selenium import webdriver
import time
import osdriver = webdriver.Chrome()
file = "file:///" + os.path.abspath("****")
driver.get(file)
driver.maximize_window()time.sleep(2)
# driver.find_element_by_link_text("请点击").click()
driver.find_element_by_tag_name("input").click()time.sleep(3)
# 获取操作alert的句柄、
alert = driver.switch_to.alert
alert.send_keys("世界")# 确认弹出框并且关闭弹出框
alert.accept()
# 取消弹出框
# alert.dismiss()time.sleep(2)
driver.quit()

多功能会话框

定位以学习和多多使用为主,所以结合div和tag来一起学习,也可以使用简单的定位当时 xpath css均可


实际操作不一定要这么复杂,只是为了学习。

from selenium import webdriver
import time
import os# 搜索一个单词是否在html原生代码中存在 ctrl+f
# 获取浏览器的驱动
driver = webdriver.Chrome()
file = "file:///" + os.path.abspath("***")
driver.get(file)
driver.maximize_window()# 定位点击的链接
div1 = driver.find_element_by_class_name("span6")
div1.find_element_by_tag_name("a").click()
# div1.find_element_by_id("show_modal").click()
time.sleep(2)div2 = div1.find_element_by_class_name("modal-body")
div2.find_element_by_link_text("click me").click()
time.sleep(2)# 然后在 div1 里面 定位到 div3
div3 = div1.find_element_by_class_name("modal-footer")# 或者是定位到所有的button元素 然后使用数组的方式
buttons = div3.find_elements_by_tag_name("button")
buttons[0].click()
# div3.find_element_by_class_name("btn").click()# # 这样的写法其实还是在主页面上找没有进入到div里面
# driver.find_element_by_class_name("modal-body").click()
# time.sleep(2)
# driver.find_element_by_class_name()
#
# # 定位到div 然后点击button按钮
# div = driver.find_element_by_class_name("modal-footer")
# div.find_element_by_class_name("btn").click()time.sleep(2)
driver.quit()

层级定位

自动化效果是 先定位到link1 然后在下拉列表中定位到Another action并点击

定位到link 然后是dropdown1

# 层级的定位  下拉列表
from selenium import webdriver
import time
import os
from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Chrome()
# / \  正则表达式
file = "file:///" + os.path.abspath("***")
driver.get(file)
driver.maximize_window()driver.find_element_by_link_text("Link1").click()
# 定位下拉列表特定的元素 把鼠标放到整个元素让元素高亮展示
# 先定位到ul 在定位 anoterele = driver.find_element_by_id("dropdown1").find_element_by_link_text("Another action")# 内置参数 需要知道操纵的是哪一个浏览器 移动到此元素的位置并且点击
ActionChains(driver).move_to_element(ele).perform() time.sleep(3)
driver.quit()

下拉框定位

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次
定位,先定位到下拉框,再定位到下拉框里面 的内容

定位到某一个具体的下拉框

# 定位下拉框 然后点击
from selenium import webdriver
import time
import os
from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Chrome()
# / \  正则表达式
file = "file:///" + os.path.abspath("***")
driver.get(file)
driver.maximize_window()# 使用xpath定位
time.sleep(2)
# driver.find_element_by_xpath("//*[@id='ShippingMethod']/option[3]").click()# 使用css selector 定位
# driver.find_element_by_css_selector("#ShippingMethod > option:nth-child(3)").click()# 先定位option 然后click点击  for循环判断
options= driver.find_element_by_id("ShippingMethod").find_elements_by_tag_name("option")
# 可以使用for + if判断定位
for option in options:# option.get 获取对应的属性if option.get_attribute('value') == '10.69':option.click()# 或者直接使用数组的定位方式
options[2].click()time.sleep(2)
driver.quit()

上传文件

操作比较简单,定位到元素之后send_keys为文件的路径即可

from selenium import webdriver
import time
import os# 获取浏览器的驱动
driver = webdriver.Chrome()
file = "file:///" + os.path.abspath("***")
driver.get(file)
driver.maximize_window()# driver.find_element_by_tag_name("input").click()
# 上传操作 定位并且发送send_keys即可
driver.find_element_by_tag_name("input").send_keys("****")
time.sleep(2)driver.quit()

关于一些常用的API就介绍到这里啦!

自动化测试 selenium工具集介绍以及常用的Webdriver API相关推荐

  1. 白鹭(egret)工具集介绍一

    白鹭[egret]工具集介绍 前言 一.egret新闻 二.引擎 1.全部版本 2.已安装版本 3.未安装版本 4. 安装本地版本 5. 引擎修复功能 总结 需要免费游戏源码的请微信搜索/扫码下方小程 ...

  2. 【转】vs平台工具集介绍,vc6~vs2019各IDE对应的工具集版本

    转自:vs平台工具集介绍以及安装 - jack_Meng - 博客园 一.什么是平台工具集: 平台工具集其实是MSBuild 其目录所在C:\Program Files (x86)\MSBuild\M ...

  3. java aqua和metal_Java工具集介绍9_16

    Java工具集介绍9_16 1)Coldtags suite 最新版本是3.10版. 这个集提供了超过310个JSP定制标签,解决了JSP开发者面临的大多通常任务.Coldtags集伴随着大量的.封装 ...

  4. 白鹭(egret)工具集介绍二

    白鹭[egret]工具集介绍二 前言 一.Egret Wing 3 二.Res Depot 三.Texture Merger 四.Egret Feather 五.Egretia Server 六.Eg ...

  5. Binutils工具集 GCC工具集介绍

    GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...

  6. UI 自动化测试 —— selenium的简单介绍和使用

    selenium 是 web 应用中基于 UI 的自动化测试框架,支持多平台.多浏览器.多语言. 提到 UI 自动化就先了解什么是自动化测试? 目录 1. 自动化测试 2. UI 自动化 2.1 UI ...

  7. UG\NX二次开发 Visual Studio平台工具集介绍

    文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 一.平台工具集 平台工具集用于控制生成软件的方式. 二.设置方式 三.Visual Stud ...

  8. [工具集]介绍一波我常用的小工具

    和很多人交流之后,我发现很多我以为大家都知道的小工具,到最后只是我以为. 既然这样,这篇文章就分享一波~ 如果你那里也有好的小工具,欢迎评论区交流 毕竟,你有一个苹果,我有一个梨,咱俩一交流,就有了两 ...

  9. 混沌测试工具chaosblade介绍及常用命令汇总

    目录 一.什么是混沌测试 二.环境搭建 三.测试指导文档 四.常用命令介绍 五.注意事项 一.什么是混沌测试 类似于"故障演练",通过构造各类异常,验证系统在碰到这些异常时是否有做 ...

最新文章

  1. 关于Azure存储账户中存储虚拟机VHD文件的注意事项
  2. retinaface训练笔记
  3. oracle创建一个表同已存在表结构一样
  4. windows 打开和关闭显示器
  5. 【人脸识别】arcface详解
  6. python---(3)Python安装
  7. 【学术篇】SDOI2008 仪仗队
  8. sql server 面试_SQL Server复制面试问题与解答
  9. 第六章 jQuery中的Ajax应用
  10. Leetcode(java)
  11. 尤雨溪对 2022 Web前端生态趋势是这样看的
  12. 微信小程序 位置定位position详解,相对定位relative,绝对定位absolute相关问题
  13. stm32-beep蜂鸣器-手把手教学(如何使用原理图)
  14. Windows远程映射端口,访问服务器生成的tensorboard本地访问链接地址
  15. 编程范式:函数式编程防御式编程响应式编程契约式编程流式编程
  16. 获取同花顺数据接口_简单介绍同花顺_数据获取方式(Excel VBA)
  17. 关于硬件工程师的真相:敢问路在何方?
  18. 老站长传授网站防黑经验
  19. 关于jq工具安装shell脚本
  20. 苹果公司的Siri小姐住在何处?

热门文章

  1. 天线效应antenna effect
  2. 比特率VS波特率,以太网波特率
  3. Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)
  4. 基于51单片机51wifi控制4路继电器开关定时功能
  5. 2020 HDU多校 第一场 04-Distinct Sub-palindromes(思维)
  6. 大数据开发-数据仓库介绍
  7. win7下怎么安装IIS
  8. 【linux】进程优先级、nice系统中的nice值和nice time,top中的PR和ps中的PRI
  9. Linux 命令行——格式化输出
  10. RPG 游戏 unity ngui 实现2D名字牌血条等功能