自动化测试(三)webdriver的常用api(1)
2023-12-16 12:32:10
目录
前面两章我们讲了selenium环境的配置和一些元素定位方法,今天这节我们来讲webdriver的一些常用的api,包括等待、打印信息、浏览器的操作、键盘事件、鼠标事件、以及定位一组元素的操作。🤷?♀?
selenium+python环境没有配置好的可以先看我上两篇配置环境噢。
selenium环境配置:?自动化测试(一)配置selenium环境(带图文,防止踩坑)-CSDN博客
python环境配置:?自动化测试(前奏)Python环境配置教程(带图文)-CSDN博客
等待
sleep休眠
添加休眠非常简单,我们需要引入
time
包,就可以在脚本中自由的添加休眠时间了,这里的休眠指固定休眠
import time
time.sleep(3) #休眠三秒
隐式等待
通过添加
implicitly_wait()
方法就可以方便的实现智能等待;
implicitly_wait(30)
的用法比
time.sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
#coding=utf-8
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.implicitly_wait(10) # 设置隐式等待时间为10秒
driver.find_element(By.ID,'kw').send_keys('软件测试') # 在10秒内寻找元素,如果超时则抛出异常
time.sleep(3)
driver.quit()
其中driver.implicitly_wait(10)? 是设置隐式等待时间为10秒,WebDriver 会在这个时间内自动为你等待,直到找到元素或超时。
显式等待
使用?expected_conditions
?配合?WebDriverWait
?来等待某个条件成立。例如,等待某个元素出现。
#coding=utf-8
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
wait = WebDriverWait(driver, 10)
time.sleep(3)
element = wait.until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('软件测试')
time.sleep(3)
driver.quit()
这两行代码是使用 Selenium WebDriver 进行网页自动化测试时的常见代码。它们结合了显式等待(explicit wait)的方式来等待某个条件成立,以获取页面上的某个元素。
wait = WebDriverWait(driver, 10)
- 这行代码创建了一个?
WebDriverWait
?对象,并指定了一个等待时间,即10秒。driver
?是已经创建好的 WebDriver 实例(通常是浏览器驱动程序,如 Chrome、Firefox 等的实例)。 WebDriverWait
?会在这个指定的时间内等待,直到满足某个条件。
element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))
- 这行代码使用?
until
?方法来等待一个条件成立。在这个例子中,等待的条件是元素的存在(presence of an element)。 EC.presence_of_element_located
?是一个预期条件(expected condition),它会等待一个元素出现。(By.ID, "element_id")
?是一个定位器(locator),用于指定要查找的元素的 ID。这里,它正在等待 ID 为 "element_id" 的元素出现。- 一旦这个元素出现,
until
?方法会返回该元素,并将其赋值给变量?element
。如果超时或条件不满足,until
?方法会抛出一个异常。
显示等待与隐式等待具体可以看我之前这一篇文章:
?欢迎大家支持支持,言归正传🤦?♀?🤦?♂?😃
打印信息
打印title
示例
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.title) # 把页面title 打印出来
运行结果:
打印url ?
示例
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print(driver.current_url) #打印url
运行结果:
浏览器的操作?
浏览器最大化
我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们
“
观看
”
脚本 的执行。
driver.maximize_window()
示例:
#coding = utf-8
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
time.sleep(3)
print(driver.current_url) #打印url
设置浏览器宽、高
如果最大化还是不够灵活,能不能随意的设置浏览的宽、高显示?当然是可以的。
browser.set_window_size(width, high)
示例:
#coding=utf-8
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
time.sleep(2)
#参数数字为像素点
print("设置浏览器宽480、高800显示")
browser.set_window_size(480, 800)
time.sleep(3)
browser.quit()
操作浏览器的前进、后退
浏览器上有一个后退、前进按钮,对于做
web
自动化测试的同学来说也比较容易实现。
#浏览器的前进
browser.forward()
#浏览器的后退
browser.back()
示例:
#coding=utf-8
from selenium import webdriver
import time
browser = webdriver.Chrome()
#访问百度首页
first_url= 'http://www.baidu.com'
print("now access %s" %(first_url))
browser.get(first_url)
time.sleep(2)
#访问新闻页面
second_url='http://news.baidu.com'
print("now access %s" %(second_url))
browser.get(second_url)
time.sleep(2)
#返回(后退)到百度首页
print("back to %s "%(first_url))
browser.back()
time.sleep(1)
#前进到新闻页
print("forward to %s"%(second_url))
browser.forward()
time.sleep(2)
browser.quit()
控制浏览器滚动条
浏览器滚动条的控制需要依靠
js
脚本
#将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=0
#将浏览器滚动条滑到最底端
document.documentElement.scrollTop=10000
#将浏览器滚动条滑到最底端, 示例
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
其中,execute_script(script, *args),在当前窗口/框架同步执行javaScript
示例:
#coding=utf-8
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
#访问百度
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
#搜索
driver.find_element(By.ID,"kw").send_keys("selenium")
driver.find_element(By.ID,"su").click()
time.sleep(3)
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
time.sleep(3)
driver.quit()
键盘事件
键盘按键用法
要使用键盘按键,必须引入 keys 包:from selenium.webdriver.common.keys import Keys通过 send_keys() 调用按键:send_keys(Keys.TAB) # TABsend_keys(Keys.ENTER) # 回车send_keys(Keys.SPACE) # 空格键send_keys(Keys.ESCAPE) # 回退键( Esc )等等。。。
示例:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys #需要引入keys 包
import os,time
driver = webdriver.Chrome()
driver.get("http://demo.zentao.net/user-login-Lw==.html")
time.sleep(3)
driver.maximize_window() # 浏览器全屏显示
driver.find_element(By.ID,"account").clear()
time.sleep(3)
driver.find_element(By.ID,"account").send_keys("demo")
time.sleep(3)
#tab 的定位相当于清除了密码框的默认提示信息,等同上面的clear()
driver.find_element(By.ID,"account").send_keys(Keys.TAB)
time.sleep(3)
#通过定位密码框,enter(回车)来代替登陆按钮
driver.find_element(By.NAME,"password").send_keys(Keys.ENTER)
'''
#也可定位登陆按钮,通过enter(回车)代替click()
driver.find_element_by_id("login").send_keys(Keys.ENTER)
'''
time.sleep(3)
driver.quit()
键盘组合键用法
send_keys(Keys.CONTROL,'a') # 全选( Ctrl+A )send_keys(Keys.CONTROL,'c') # 复制( Ctrl+C )send_keys(Keys.CONTROL,'x') # 剪贴( Ctrl+X )send_keys(Keys.CONTROL,'v') # 粘贴( Ctrl+V )
示例:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element(By.ID,"kw").send_keys("selenium")
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')
time.sleep(3)
#输入框重新输入内容,搜索
driver.find_element(By.ID,"kw").send_keys("webdriver")
driver.find_element(By.ID,"su").click()
time.sleep(3)
driver.quit()
鼠标事件
要使用鼠标事件需要导入工具包:
from selenium.webdriver.common.action_chains import ActionChains
语法示例如下:
#鼠标拖动事件
ActionChains(driver).move_to_element(element).perform()
ActionChains(driver)
生成用户的行为。所有的行动都存储在
actionchains
对象。通过
perform()
存储的行为。
move_to_element(element)
移动鼠标到一个元素中,
menu
上面已经定义了他所指向的哪一个元素
perform()
执行所有存储的行为
ActionChains 类 方法:context_click() 右击double_click() 双击drag_and_drop() 拖动move_to_element() 移动
示例:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")
qqq =driver.find_element(By.XPATH,".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右键
ActionChains(driver).double_click(qqq).perform() #双击
#定位元素的原位置
element = driver.find_element(By.ID,"s_btn_wr")
#定位元素要移动到的目标位置
target = driver.find_element(By.NAME,"btn");
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
定位一组元素
webdriver
可以很方便的使用
findElement
方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements
方法。
定位一组对象一般用于以下场景:
批量操作对象,比如将页面上所有的 checkbox 都勾上先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox ,然后选择最后一个
用以下
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>
用浏览器打开这个页面我们看到三个复选框和两个单选框。下面我们就来定位这三个复选框。
#coding=utf-8
from selenium import webdriver
import time
import os
from selenium.webdriver.common.by import By
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('checkbox.html')
dr.get(file_path)
# 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
inputs = dr.find_elements(By.TAG_NAME,'input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep(2)
dr.quit()
get_attribute
:获得属性值。
本节就到这里啦,你们的支持就是我前进的动力,希望大家多多支持噢🤦?♀?🤦?♂?🤷?♀?🤷?♂?🎈
文章来源:https://blog.csdn.net/m0_62468521/article/details/135021526
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!