栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

selenium【二】—webdriver API

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

selenium【二】—webdriver API

目录
  • 第一个简单的脚本
  • 元素的定位
    • 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代码)

脚本代码:

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代码如下



脚本代码:

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为例:




Checkbox


checkbox

如果想选中前三个复选框

import time

from selenium import webdriver
import os.path
driver = webdriver.Chrome()
#浏览器打开本地的html,URL要加上 file:///
file = "file:///"+os.path.abspath("E:课件selenium2htmlcheckbox.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 time

from selenium import webdriver
import os.path
driver = webdriver.Chrome()
#浏览器打开本地的html,URL要加上 file:///
file = "file:///"+os.path.abspath("E:课件selenium2htmlcheckbox.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()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886430.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号