目录

  • 第一个简单的脚本
  • 元素的定位
    • id和name
    • tag name 和class name 定位
    • CSS定位
    • XPath定位
    • link text定位
    • Partial link text
  • 操作测试对象
    • 关于clear
    • 关于submit
    • 关于text
  • 添加等待
    • sleep
    • 智能等待
  • 打印信息
    • 打印title和URL
  • 浏览器的操作
    • 浏览器的最大化
    • 设置浏览器的宽、高
    • 浏览器的前进、后退
    • 控制浏览器滚动条
  • 键盘事件
    • 键盘按键的用法
      • 模拟键盘用enter键登录
      • 模拟键盘的tab键
    • 键盘组合键用法
  • 鼠标事件
    • 右击与双击
    • 移动
  • 定位一组元素
  • 多层框架 / 窗口定位
  • 层级定位
  • 下拉框的处理
  • alert 、confirm、prompt的处理
    • alert
  • DIV对话框的处理
  • 上传文件操作

第一个简单的脚本

简单脚本的生成:(1)在脚本的头部导入需要的包(2)获取浏览器的驱动(3)使用浏览器驱动对需要测试的文件系统进行操作(4)测试完成之后关闭浏览器

元素的定位

对界面的元素进行操作,首先要进行定位。
定位元素是自动化测试的基础。

id和name

  • id定位
    例如百度的输入框(以下是html代码)
<input id="kw" name="wd" class="s_ipt" value="百度" maxlength="255" autocomplete="off">

脚本代码:

from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)
# 用id来定位百度搜索框
driver.find_element_by_id("kw").send_keys("李易峰")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()

id是全局唯一的,在同一个页面中。不可能有元素的id是一样的。

  • 用name来定位元素
    禅道登录界面的html代码如下
<input class="form-control" type="text" name="account" id="account" autofocus="">
<input class="form-control" type="password" name="password">
<button type="submit" id="submit" class="btn btn-primary" data-loading="稍候...">登录</button>

脚本代码:

from selenium import webdriver
import time
driver=webdriver.Chrome()
url="http://127.0.0.1:88/zentao/user-login-L3plbnRhby8=.html"
driver.get(url)# 用name来定位
driver.find_element_by_name("account").send_keys("自己的登录名")
driver.find_element_by_name("password").send_keys("禅道自己设置的密码")
time.sleep(3)
driver.find_element_by_id("submit").click()
time.sleep(3)
driver.quit()

使用name来定位元素的时候,要确保这个元素的name属性在全局唯一。

tag name 和class name 定位

  • 可以通过find_element_by_class_name(“s_ipt”)来捕获到百度的输入框。
  • 通过tag name定位百度输入框的效果如下图所示
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_tag_name("input").send_keys("李易峰")
driver.find_element_by_tag_name("input").click()
time.sleep(3)
driver.quit()

执行效果

说明页面中的tag name不是全局唯一的

tag name和class name 来定位元素的时候,要保证页面只有这一个元素,否则会定位失败

CSS定位

CSS的获取:
开发者工具中右键—copy—copy selector
脚本代码:

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 通过CSS selector来定位
driver.find_element_by_css_selector("#kw").send_keys("胡歌")
driver.find_element_by_css_selector("#su").click()
time.sleep(2)
driver.quit()

XPath定位

元素的源码从标签的头到定位的地方都经过了那些标签/路径
XPathde 获取:在Chrome开发者工具中—右击copy—copy XPath。
脚本代码:

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 通过xpath来定位
driver.find_element_by_xpath("//*[@id='kw']").send_keys("胡歌")
driver.find_element_by_xpath("//*[@id='su']").click()
time.sleep(3)
driver.quit()

如果一个元素没有id属性,name、class不是全局唯一的,该怎么定位?
使用XPath

link text定位

如果想定位百度页面左上方的“新闻”这样的文字链接字样,使用class是无法定位到的。因为class属性不唯一。
因此可以使用link tetx来定位
脚本代码:

from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)
# 使用link text定位元素
driver.find_element_by_link_text("新闻").click()
time.sleep(3)
driver.quit()

Partial link text

通过部分链接定位

如果想定位百度页面上的“hao123”,可以通过下面的方式。
脚本代码:

from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)
# 使用link text定位元素
driver.find_element_by_partial_link_text("123").click()time.sleep(3)
driver.quit()

总结:

操作测试对象

前面讨论的都是定位元素,定位只是第一步,定位之后需要对这个元素进行操作。是鼠标点击还是键盘输入,或者清除元素的内容,或者提交表单等。这个取决于定位元素需要进行的下一步操作。
webdriver 中比较常用的操作对象的方法有下面几个:

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象输入的文本内容
  • submit 提交
  • text 用于获取元素的文本信息

关于clear

如果在输入框输入一个内容之后,还想在输入其他的内容,就先清除掉前一个输入的内容,在输入下一个内容

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("胡歌")
driver.find_element_by_id("su").click()
time.sleep(3)
# 清除输入框的内容
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("李易峰")
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()

关于submit

打开百度搜索页面,按钮“百度一下”元素的类型type=“submit”,所以把“百度一下”的操作从click 换成
submit 可以达到相同的效果

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("胡歌")
driver.find_element_by_id("su").submit()
time.sleep(3)
driver.quit()

关于text

text 用于获取元素的文本信息

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
# text的使用
text=driver.find_element_by_id("s-top-left").text
print(text)
time.sleep(2)
driver.quit()

执行结果

添加等待

要一个页面的基础上,要点击这个页面中的其他元素,必须先等待这个页面中的所有元素加载出来。

sleep

添加休眠,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了,这里的休眠指固定休眠.

智能等待

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("肖战")
driver.find_element_by_id("su").submit()
# 智能等待
driver.implicitly_wait(10)
# 固定等待  # time.sleep(5)
driver.find_element_by_link_text("肖战 - 百度图片").click()
# 固定等待
time.sleep(5)
driver.quit()

打印信息

打印title和URL

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("肖战")
driver.find_element_by_id("su").submit()
time.sleep(4)
title=driver.title
url=driver.current_url
print(title)
print(url)
driver.quit()

浏览器的操作

浏览器的最大化

我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 浏览器的最大化
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("迪丽热巴")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()

设置浏览器的宽、高

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("迪丽热巴")
driver.find_element_by_id("su").click()
# 设置浏览器的宽、高(前面是宽、后面是高)
driver.set_window_size(280,600)
time.sleep(4)
driver.quit()

浏览器的前进、后退

from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("迪丽热巴")
driver.find_element_by_id("su").click()
time.sleep(4)
#  浏览器的后退
driver.back()
time.sleep(4)
# 浏览器的前进
driver.forward()
time.sleep(3)
driver.quit()

控制浏览器滚动条

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("猫咪")
driver.find_element_by_id("su").click()
driver.maximize_window()
time.sleep(4)
# 控制浏览器的滚动条(下拉)
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(4)
driver.quit()

键盘事件

键盘按键的用法

模拟键盘用enter键登录

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get("http://127.0.0.1:88/zentao/user-login-L3plbnRhby8=.html")
driver.maximize_window()
# 登录
driver.find_element_by_id("account").send_keys("自己的用户名")
driver.find_element_by_name("password").send_keys("自己的密码")
# 用enter键直接登录(相当于快捷键)【在输入密码的框输完密码之后,按enter会登录】
driver.find_element_by_name("password").send_keys(Keys.ENTER)
time.sleep(4)
driver.quit()

模拟键盘的tab键

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get("http://127.0.0.1:88/zentao/user-login-L3plbnRhby8=.html")
driver.find_element_by_id("account").send_keys("admin")
driver.find_element_by_id("account").send_keys(Keys.TAB)
time.sleep(4)

键盘组合键用法

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("肖战")
time.sleep(3)
# ctrl+a 全选
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
# Ctrl+x剪切
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("刘亦菲")
driver.find_element_by_id("su").submit()
time.sleep(3)
driver.quit()

鼠标事件

要使用鼠标事件需要导入工具包:
from selenium.webdriver.common.action_chains import ActionChains

右击与双击

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("刘亦菲")
su=driver.find_element_by_id("su")
# 右击
ActionChains(driver).context_click(su).perform()
time.sleep(3)
# 双击
ActionChains(driver).double_click(su).perform()
time.sleep(3)
driver.quit()

移动


当鼠标移动到一句话时,这句话下面会加上一条横线。

from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("彭于晏")
driver.find_element_by_id("su").submit()
driver.maximize_window()
time.sleep(3)
tr = driver.find_element_by_partial_link_text("40岁彭于晏晒胡渣自拍!头发竖起来似海胆,不修边幅被")
ActionChains(driver).move_to_element(tr).perform()
time.sleep(6)
driver.quit()

定位一组元素

用以下html为例:

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2</label>
<div class="controls">
<input type="checkbox" id="c2" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c3">checkbox3</label>
<div class="controls">
<input type="checkbox" id="c3" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="r">radio</label>
<div class="controls">
<input type="radio" id="r2" />
</div>
</div>
</form>
</div>
</body>
</html>

如果想选中前三个复选框

import timefrom selenium import webdriver
import os.path
driver = webdriver.Chrome()
#浏览器打开本地的html,URL要加上 file:///
file = "file:///"+os.path.abspath("E:\课件\selenium2html\checkbox.html")
driver.get(file)
driver.maximize_window()
driver.find_element_by_id("c1").click()
driver.find_element_by_id("c2").click()
driver.find_element_by_id("c3").click()
time.sleep(3)
driver.quit()

或者

import timefrom selenium import webdriver
import os.path
driver = webdriver.Chrome()
#浏览器打开本地的html,URL要加上 file:///
file = "file:///"+os.path.abspath("E:\课件\selenium2html\checkbox.html")
driver.get(file)
driver.maximize_window()
inputs=driver.find_elements_by_tag_name("input")
#从一组元素中找出checkbox
for input in inputs:if input.get_attribute('type')=='checkbox':input.click()
time.sleep(3)
driver.quit()

多层框架 / 窗口定位

from selenium import webdriver
import time
import os.path
driver=webdriver.Chrome()
file = "file:///"+os.path.abspath("E:\课件\selenium2html\\frame.html")driver.get(file)
driver.maximize_window()
# 转换层级
driver.switch_to.frame("f1")
driver.switch_to.frame("f2")driver.find_element_by_id("kw").send_keys("nihao")
driver.find_element_by_id("su").click()
time.sleep(3)
# 回到默认页面
driver.switch_to.default_content()
driver.switch_to.frame("f1")
driver.find_element_by_link_text("click").click()
time.sleep(3)
driver.quit()

层级定位


如果想定位Link1下面的Another action 应该怎么定位?

思路:
先点击显示出1个下拉菜单,然后在定位到该下拉菜单所在的ul,在定位这个ul下的某个具体的link。
以下以定位第一个下拉菜单的Another action为例

# 层级定位
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
import os.path
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("E:/课件/selenium2html/level_locate.html")
driver.get(file)
driver.maximize_window()
driver.find_element_by_link_text("Link1").click()
# 定位下拉列表特定的元素
ele = driver.find_element_by_id("dropdown1").find_element_by_link_text("Another action")
# 把鼠标放到特定的元素上,让元素高亮展示
ActionChains(driver).move_to_element(ele).perform()
time.sleep(6)
driver.quit()

下拉框的处理


如果想定位到下拉框中的9.03,该怎么定位?

import os
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
file="file:///"+os.path.abspath("E:/课件/selenium2html/drop_down.html")
driver.get(file)
time.sleep(3)
#xpath定位
driver.find_element_by_xpath("//*[@id='ShippingMethod']/option[3]").click()
#css_selector定位
#driver.find_element_by_css_selector("#ShippingMethod > option:nth-child(4)").click()
time.sleep(4)
driver.quit()

也可以通过多组元素进行定位

import os
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
file="file:///"+os.path.abspath("E:/课件/selenium2html/drop_down.html")
driver.get(file)
time.sleep(3)options=driver.find_element_by_id("ShippingMethod").find_elements_by_tag_name("option")
for option in options:if option.get_attribute("value")=='10.69':option.click()
time.sleep(4)
driver.quit()

也可以通过数组进行定位

import os
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
file="file:///"+os.path.abspath("E:/课件/selenium2html/drop_down.html")
driver.get(file)
time.sleep(3)
options=driver.find_element_by_id("ShippingMethod").find_elements_by_tag_name("option")
options[2].click()
time.sleep(4)
driver.quit()

alert 、confirm、prompt的处理

alert


1.如果要关闭此弹框,应该怎么做?

import os
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
file="file:///"+os.path.abspath("E:/课件/selenium2html/alert.html")
driver.get(file)
time.sleep(3)
driver.find_element_by_id("tooltip").click()
time.sleep(4)
# 关闭弹框
# 得到了操作弹框的句柄
alert=driver.switch_to.alert
alert.accept()
time.sleep(4)
driver.quit()

2.如果要在弹框中输入一些内容,该怎么做?

import os
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
file="file:///"+os.path.abspath("E:/课件/selenium2html/send.html")
driver.get(file)
driver.find_element_by_tag_name("input").click()
time.sleep(3)
alert=driver.switch_to.alert
alert.send_keys("hhhhhh")
# alert.accept()不仅可以关闭弹出框,也可以实现确定
alert.accept()
time.sleep(4)
driver.quit()

DIV对话框的处理

如果想实现上图这样的效果,该怎么处理?

import os
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
file="file:///"+os.path.abspath("E:/课件/selenium2html/modal.html")
driver.get(file)
# driver.find_element_by_tag_name("Click").click()
driver.find_element_by_link_text("Click").click()
time.sleep(3)
div0=driver.find_element_by_class_name("modal-body")
div0.find_element_by_id("click").click()
time.sleep(3)
div1=driver.find_element_by_class_name("modal-footer")
div1.find_element_by_class_name("btn").click()
time.sleep(3)
driver.quit()

或者

import os
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
file="file:///"+os.path.abspath("E:/课件/selenium2html/modal.html")
driver.get(file)
# driver.find_element_by_tag_name("Click").click()
driver.find_element_by_link_text("Click").click()
time.sleep(3)
div0=driver.find_element_by_class_name("modal-body")
div0.find_element_by_id("click").click()
time.sleep(3)
div1=driver.find_element_by_class_name("modal-footer")
buttons=div1.find_elements_by_tag_name("button")
buttons[0].click()
time.sleep(3)
driver.quit()

上传文件操作

import os
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
file="file:///"+os.path.abspath("E:/课件/selenium2html/upload.html")
driver.get(file)
time.sleep(5)
driver.find_element_by_tag_name("input").send_keys("E:/画图板/005.jpg")
time.sleep(5)
driver.quit()

selenium【二】—webdriver API相关推荐

  1. 测开 - 自动化测试selenium(WebDriver API) - 细节狂魔

    文章目录 回顾 什么是驱动?驱动的工作原理是什么? 一个简单的 Web自动化 演示 1.定位元素的方法 - 只介绍两种最常使用的 2.元素的操作 3.等待 3.1.强制等待 强制等待的优点 & ...

  2. Python+selenium WebDriver API

    目录 2.1 操作元素基本方法 2.2 常用8种元素定位(Firebug和firepath) 2.3 xpath定位 2.4 CSS定位 2.5 SeleniumBuilder辅助定位元素 2.6 操 ...

  3. Selenium WebDriver Api 知识梳理

    之前一直没有系统的梳理WebDriver Api的相关知识,今天借此机会整理一下. 1.页面元素定位 1.1.8种常用定位方法 #id定位 driver.find_element_by_id()#na ...

  4. Python+Selenium 自动化测试 2. Webdriver API介绍

    目录 一 Webdriver介绍 二 webdriver实现的原理 三  API介绍 Webdriver 元素的查找的八种方式 find_element_by_id()  源码 find_elemen ...

  5. Python3 Selenium自动化web测试 == 第三节 常用WebDriver API使用示例上(24个API)

    前置步骤: 安装selenium,chrome驱动,Python3.6 学习目的: 常见API的使用 涉及的API: step1: 访问一个网址 step2: 网页的前进和后退 step3: 刷新当前 ...

  6. Webdriver API (二)

    (转载) 1.3 打开测试页面 对页面对测试,首先要打开被测试页面的地址(如:http://www.google.com),web driver 提供的get方法可以打开一个页面: // And no ...

  7. 译Selenium Python Bindings 6 - WebDriver API

    本章涉及Selenium WebDriver的所有接口. Recommended Import Style 推荐的导入风格如下: from selenium import webdriver 然后,你 ...

  8. Selenium WebDriver API 进阶使用,模块化参数化进行自动化测试设计

    2019独角兽企业重金招聘Python工程师标准>>> WebDriver API 进阶使用 元素定位 我们知道,WebDriver API的调用以及自动化测试,务必从页面元素的定位 ...

  9. 自动化测试 selenium工具集介绍以及常用的Webdriver API

    selenium 什么是selenium? selenium1.0 selenium 2.0 webdriver的原理 selenium 3.0 安装python和selenuim 环境安装注意事项 ...

最新文章

  1. CentOS 8 已是绝版?还有后续么?
  2. 海南医养康养健康文旅-健康中国·万祥军:谋定国际化破题
  3. LuaForUnity1:Lua介绍与使用
  4. 网页设计如何排成一列_学习DIV+CSS网页布局之一列布局
  5. 【原创】ES5高效封装WIN10系统教程2020系列(一)母盘定制
  6. java面试说话技巧,Java面试题及解答技巧解析介绍
  7. 联想G480 i3 2348M扩展内存
  8. linux里case命令,Linux系统中的case命令怎么用
  9. 1.9万亿美元市场,自动驾驶开发者向何处去?
  10. a=a*10+b型题目
  11. ROS项目开发实战(三)——使用QT进行ROS的GUI界面设计(详细教程附代码!!!)
  12. Kubernetes调度
  13. 华中农业大学算法实验课答案
  14. html全选替换,网站上如何实现全选与反选
  15. 给github项目贡献代码的操作流
  16. 电信联通上海分别启用181与185号段
  17. 【黑金ZYNQ7000系列原创视频教程】03.体验FPGA里的ARMmdash;mdash;裸机helloworld实验...
  18. SMU Winter 2023 (div.2)1
  19. 中国人身材测试小软件编码,测试 || 我怀疑你是假中国人,不信你来试试
  20. C语言 有符号类型转换为无符号类型

热门文章

  1. 【Android】获取APP里面的图片素材
  2. 小白Linux(lubuntu)安装及配置血泪之旅
  3. Lubuntu纯小白级别安装配置
  4. Android UI优化—从Android渲染原理理解UI卡顿
  5. 如何对pdf文件大小进行压缩?怎么压缩pdf文件kb?
  6. Ps大片教程:—失落之城
  7. TabLayout设置图标和字体
  8. mysql查询转json数据库_json格式数据,将数据库中查询的结果转换为json, 然后调用接口的方式返回json(方式一)...
  9. 借钱的原则和向别人借钱的技巧
  10. SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【前端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】