赞
踩
selenium 是一个 web 的自动化测试工具,它可以通过id/css/class/xpath等定位到具体的网页元素并进行一系列操作,从而实现自动化测试!
安装:pip install selenium
使用:
1.import selenium
2.from selenium import xxx
1.安装webdriver
使用selenium首先需要安装webdriver,来连接到浏览器,并进行交互,从而实现脚本控制浏览器!
我在谷歌浏览器和火狐浏览器都装了:
火狐浏览器webdriver下载地址
谷歌浏览器webdriver下载地址1
谷歌浏览器webdriver下载地址2
谷歌浏览器webdriver下载地址3
谷歌浏览器下载之前先在地址栏输入chrome://version看一下自己的版本再下载对应的
2.启动浏览器:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
同理:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')
如果需要后台运行:
option = webdriver.ChromeOptions()
option.add_argument('--headless')
driver = webdriver.Chrome(executable_path="webdriver\chrome/chromedriver",chrome_options=option)
3.定位网页元素
网页元素的定位是自动化测试的核心,也是最容易踩坑的地方,这个地方需要格外注意一下!通常的定位网页元素的方法有以下几种:
1.id定位:find_element_by_id()
2.name定位:find_element_by_name()
3.class定位:find_element_by_class_name()
4.link定位:find_element_by_link_text()
5.partial link text定位:find_element_by_partial_link_text()
6.tag定位:find_element_by_tag_name()
7.xpath定位:find_element_by_xpath()
8.css定位:find_element_by_css_selector()
有的class name是有多个class组合的复合类,中间以空格隔开,使用find_element_by_class_name()就会定位失败,这时可以用"."代替空格。
还可以用find_elements_by_xx定位一组元素
4.selenium设置等待时间
有的时候网页内容在缓存或者网页切换延迟等,会导致下一次定位元素失败,因此需要设置等待时间。
1.强制等待:
import time
time.sleep(x)
2.显示等待
显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。
from selenium import webdriver
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.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver, 5,0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')
driver.quit()
WebDriverWait类是由WebDirver
提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5,
ignored_exceptions=None)
- driver :浏览器驱动。
- timeout :最长超时时间,默认以秒为单位。
- poll_frequency :检测的间隔(步长)时间,默认为0.5s。
- ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。
WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。
1.until(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。
2. until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。 在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。
3.隐式等待
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import ctime
driver = webdriver.Firefox()
# 设置隐式等待为10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
try:
print(ctime()) driver.find_element_by_id("kw22").send_keys('selenium')
except NoSuchElementException as e:
print(e)
finally:
print(ctime())
driver.quit()
WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。
implicitly_wait() 默认参数的单位为秒,本例中设置等待时长为10秒。
首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。
其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。
假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。
隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。
5.控制浏览器操作
函数 | 作用 |
---|---|
driver.set_windows_size() | 设置浏览器大小 (参数为像素点) |
driver.back() | 回退页面 |
driver.forward() | 前进页面 |
driver.refresh() | 刷新页面 |
driver.maximize_window() | 页面最大化 |
driver.minimize_window() | 页面最小化 |
from selenium import webdriver driver = webdriver.Firefox() #访问百度首页 first_url= 'http://www.baidu.com' print("now access %s" %(first_url)) driver.get(first_url) driver.maximize_window() #访问新闻页面 second_url='http://news.baidu.com' print("now access %s" %(second_url)) driver.get(second_url) #返回(后退)到百度首页 print("back to %s "%(first_url)) driver.back() #前进到新闻页 print("forward to %s"%(second_url)) driver.forward() # 控制浏览器滚动 scol_len = random.randrange(0, 10000, 1000) js = "var q=document.documentElement.scrollTop=%s" % scol_len driver.execute_script(js) driver.quit()
7.操作网页元素
方法 | 作用 |
---|---|
click() | 单击元素 |
clear() | 清除文本(如果可以) |
send_keys (value) | 模拟按键操作 |
get_attribute(name) | 获取元素属性值 |
is_displayed() | 设置该元素是否用户可见 |
submit() | 提交表单 |
size | 返回元素的尺寸 |
location | 返回元素坐标 |
text | 获取元素的文本 |
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") #刷新浏览器 browser.refresh() #提交表单 search_text = driver.find_element_by_id('kw') search_text.send_keys('selenium') search_text.submit() # 获得输入框的尺寸 size = driver.find_element_by_id('kw').size print(size) loca=driver.find_element_by_id('kw').location print(loca) more_x = loca.get('x') #元素的x坐标 more_y = loca.get('y') #元素的y坐标 more_w = size.get('width') #元素的宽 more_h = size.get('height') #元素的高 # 返回百度页面底部备案信息 text = driver.find_element_by_id("cp").text print(text) # 返回元素的属性值, 可以是 id、 name、 type 或其他任意属性 attribute = driver.find_element_by_id("kw").get_attribute('type') print(attribute) # 返回元素的结果是否可见, 返回结果为 True 或 False result = driver.find_element_by_id("kw").is_displayed() print(result) driver.quit()
8.鼠标操作
在 WebDriver 中, 将关于鼠标操作的方法封装在 ActionChains 类提供。
from selenium.webdriver import ActionChains
导入提供鼠标操作的 ActionChains 类。
ActionChains(driver)
调用 ActionChains()类, 将浏览器驱动 driver 作为参数传入。
常用函数:
函数 | 作用 |
---|---|
double_click() | 双击 |
drag_and_drop(source, target) | 拖拽到某个元素然后松开 |
move_to_element(above) | 鼠标移动到某个元素上悬停 |
context_click() | 模拟鼠标右键操作, 在调用时需要指定元素定位(右击) |
perform() | 执行所有 ActionChains 中存储的行为, 可以理解成是对整个操作的提交动作。 |
click(on_element=None) | 单击鼠标左键 |
move_by_offset(xoffset, yoffset) | 鼠标从当前位置移动到某个坐标 |
drag_and_drop_by_offset(source, xoffset, yoffset) | 拖拽到某个坐标然后松开 |
key_down(value, element=None) | 按下某个键盘上的键 |
key_up(value, element=None) | 松开某个键 |
release(on_element=None) | 在某个元素位置松开鼠标左键 |
---|---|
send_keys_to_element(element, *keys_to_send) | 发送某个键到指定元素 |
move_to_element_with_offset(to_element, xoffset, yoffset) | 移动到距某个元素(左上角坐标)多少距离的位置 |
from selenium import webdriver
# 引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")
# 定位到要悬停的元素
above = driver.find_element_by_link_text("设置")
# 对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(above).perform()
9.键盘操作
函数 | 作用 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键(BackSpace) |
send_keys(Keys.SPACE) | 空格键(Space) |
send_keys(Keys.TAB) | 制表键(Tab) |
send_keys(Keys.ESCAPE) | 回退键(Esc) |
send_keys(Keys.ENTER) | 回车键(Enter) |
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) |
send_keys(Keys.F1) | 键盘 F1 |
from selenium import webdriver # 引入 Keys 模块 from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get("http://www.baidu.com") # 输入框输入内容 driver.find_element_by_id("kw").send_keys("seleniumm") # 删除多输入的一个 m driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) # 输入空格键+“教程” driver.find_element_by_id("kw").send_keys(Keys.SPACE) driver.find_element_by_id("kw").send_keys("教程") # ctrl+a 全选输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a') # ctrl+x 剪切输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x') # ctrl+v 粘贴内容到输入框 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v') # 通过回车键来代替单击操作 driver.find_element_by_id("su").send_keys(Keys.ENTER) driver.quit()
10.获取断言信息
拿实际结果与预期进行比较,这个比较的称之为断言,通常通过获取title 、URL和text等信息进行断言。
title:用于获得当前页面的标题。
current_url:用户获得当前页面的URL。
text:获取搜索条目的文本信息。
from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get("https://www.baidu.com") print('Before search================') # 打印当前页面title title = driver.title print(title) # 打印当前页面URL now_url = driver.current_url print(now_url) driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() sleep(1) print('After search================') # 再次打印当前页面title title = driver.title print(title) # 打印当前页面URL now_url = driver.current_url print(now_url) # 获取结果数目 user = driver.find_element_by_class_name('nums').text print(user) driver.quit()
运行结果如下:
Before search================
百度一下,你就知道
https://www.baidu.com/
After search================
selenium_百度搜索
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx...
搜索工具
百度为您找到相关结果约5,380,000个
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。