selenium【二】—webdriver API

第一个简单的脚本

在这里插入图片描述简单脚本的生成:(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 time

from 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 time

from 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()
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值