目录
等待
sleep休眠
隐式等待
显式等待
打印信息
打印title
打印url
浏览器的操作
浏览器最大化
设置浏览器宽、高
操作浏览器的前进、后退
控制浏览器滚动条
键盘事件
键盘按键用法
键盘组合键用法
鼠标事件
定位一组元素
前面两章我们讲了selenium环境的配置和一些元素定位方法,今天这节我们来讲webdriver的一些常用的api,包括等待、打印信息、浏览器的操作、键盘事件、鼠标事件、以及定位一组元素的操作。🤷♀️
selenium+python环境没有配置好的可以先看我上两篇配置环境噢。
selenium环境配置: 自动化测试(一)配置selenium环境(带图文,防止踩坑)-CSDN博客
python环境配置: 自动化测试(前奏)Python环境配置教程(带图文)-CSDN博客
等待
sleep休眠
import time
time.sleep(3) #休眠三秒
隐式等待
#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
方法会抛出一个异常。
显示等待与隐式等待具体可以看我之前这一篇文章:
Selenium 3和JUnit 5中的显示等待与隐式等待-CSDN博客
欢迎大家支持支持,言归正传🤦♀️🤦♂️😃
打印信息
打印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()
操作浏览器的前进、后退
#浏览器的前进
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()
控制浏览器滚动条
#将浏览器滚动条滑到最顶端
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 类 方法: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()
定位一组元素
批量操作对象,比如将页面上所有的 checkbox 都勾上先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox ,然后选择最后一个
<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()