selenium使用全解

官网:https://www.selenium.dev/
中文网:http://www.selenium.org.cn/

一、selenium简介

百科介绍

Selenium是一个用于Web应用(网站)的测试工具,是直接运行在浏览器上的,不仅支持各种主流浏览器以及IE(7-11)版本,还能针对不同系统测试。框架底层是使用JavaScript模拟真实用户对浏览器进行操作。

优势:

通过编写模仿用户操作的 Selenium 测试脚本,可以从终端用户的角度来测试应用程序。通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。Selenium 的核心,也称browser bot,是用 JavaScript 编写的。这使得测试脚本可以在受支持的浏览器中运行。

二、下载

淘宝镜像:https://developer.aliyun.com/mirror/NPM?from=tnpm

windows版可以直接把chromedriver.exe放到要运行的python文件所在目录,也可以将chromedriver.exe的路径添加到环境变量path中。

三、流程API简介

from selenium import webdriver
import time

# 获取一个浏览器对象
br = webdriver.Chrome()

# 打开一个页面
br.get('http://www.baidu.com')

# 获取页面的源代码(运行后在内存中渲染的页面元素)
print(br.page_source)


# 根据id查找元素
kw = br.find_element_by_id('kw')
# 往表单输入框中输入内容
kw.send_keys('你好')
# 点击某个元素
br.find_element_by_id('su').click()


time.sleep(3)
# 将页面内容保存成截图
br.save_screenshot('./1.png')

# 设置窗口最大化
br.maximize_window()
time.sleep(2)
# 指定浏览器窗口大小
br.set_window_size(1200, 800)

# 设置浏览器的坐标 四个参数分别是 x坐标 y坐标 窗口的宽 框框的高
br.set_window_rect(100, 200, 300, 500)


# 获取所有cookie
print(br.get_cookies())
print('*' * 10)
# 获取某一个cookie的信息
print(br.get_cookie('BDORZ'))


time.sleep(2)
# 关闭窗口
br.close()
# 退出浏览器
time.sleep(2)
br.quit()

四、元素对象操作

# 根据类名查找元素
br.find_element_by_class_name('btn')

# 根据元素的name值查找元素
br.find_element_by_name('ie')

# 根据元素的标签名称查找元素
br.find_element_by_tag_name('div')

# 根据链接包裹着的文字查找
br.find_element_by_link_text('地图')

# 根据链接包裹着的部分文字查找
br.find_element_by_partial_link_text('地')

# 根据css选择器规则进行查找元素
br.find_element_by_css_selector('#wrapper')

# 根据xpath规则进行查找元素
find_element_by_xpath('//*[@id="q"]')

五、多元素查找

与单元素查找的区别是element改成了elements,如下:

br.find_elements_by_tag_name('a')

六、获取属性和文本

1、获取属性

br.find_element_by_class_name('btn').get_attribute('属性名')

2、获取文本

br.find_element_by_class_name('btn').text

七、 交互操作

1、运行javascript

br.execute_script('alert("hello world")')

八、iframe内嵌框架

操作iframe的常用方法有:switch_to.frame()switch_to.parent_frame()

九、等待操作

1、隐式等待

到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行。

br = webdriver.Chrome()

# 设置最长等待10秒
br.implicitly_wait(10)

2、显式等待

指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果成立就会立即返回,如果不成立,就会一直等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回

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

br = webdriver.Chrome()
br.get('https://www.baidu.com/')
wait = WebDriverWait(br, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

上述的例子中的条件:EC.presence_of_element_located()是确认元素是否已经出现了
EC.element_to_be_clickable()是确认元素是否是可点击的

十、常用判断

  • title_is 标题是某内容
  • title_contains 标题包含某内容
  • presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
  • visibility_of_element_located 元素可见,传入定位元组
  • visibility_of 可见,传入元素对象
  • presence_of_all_elements_located 所有元素加载出
  • text_to_be_present_in_element 某个元素文本包含某文字
  • text_to_be_present_in_element_value 某个元素值包含某文字
  • frame_to_be_available_and_switch_to_it frame加载并切换
  • invisibility_of_element_located 元素不可见
  • element_to_be_clickable 元素可点击
  • staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
  • element_to_be_selected 元素可选择,传元素对象
  • element_located_to_be_selected 元素可选择,传入定位元组
  • element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
  • element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
  • alert_is_present 是否出现Alert
get_cookies()
get_cookie('key')
delete_all_cookes()
delete_cookie('key')
add_cookie({'name': 'age', 'value': '18', 'domain': 'www.baidu.com'})

十二、选项卡管理

通过执行js命令实现新开选项卡window.open()
不同的选项卡是存在列表里br.window_handles
通过br.window_handles[0]就可以操作第一个选项卡

import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.jd.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')

十三、无界面模式

如果界面影响其他操作也不用担心,chrome和火狐都提供的有无界模式。只需要传入一些参数即可

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 配置chrome的参数
options = Options()
options.add_argument('--headless')
# options.add_argument('--disable-gpu')

# 获取一个浏览器对象
br = webdriver.Chrome(chrome_options=options)

十四、容口操作

# 获取当前浏览器的大小
driver.get_window_size()

# 通过像素设置浏览器的大小
driver.set_window_size('width','height')

# 获取当前窗口针对于Windows的位置的坐标x,y
driver.get_window_position()

# 设置当前窗口针对Windows的位置,x,y
driver.set_window_position(20,20)

# 最大化当前窗口,不需要传参
driver.maximize_window()

# 返回当前操作的浏览器句柄
driver.current_window_handle

# 返回所有打开server的浏览器句柄
driver.window_handles

# 获取当前页面的二进制图片数据,需要自己去写入文件
driver.get_screenshot_as_png()

# as_png的上层封装,只需要传入图片名称自动写成图片
driver.get_screenshot_as_file('fileName.png')

十五、浏览器操作

# 刷新
driver.refresh()

# 前进
driver.forward()

# 后退
driver.back()

# 当开启多个时,关闭当前页面
driver.close()

# 退出并关闭所有页面驱动
driver.quit()

参考链接:

PS:写作不易,如要转裁,请标明转载出处。
%{ comment.page.total }条评论

猜你想看

微信小程序:前端开发宝典

最近文章
工具操作
  • 内容截图
  • 全屏
登录
注册
回顶部