Selenium 安装
Web 调试工具介绍与开发环境搭建
- 官网下载
https://www.python.org/
- 安装 pip:
https://pypi.python.org/pypi/pip
; 解压pip-version目录之后 执行 python setup.py install
- 安装 selenium:
pip install -U selenium
- 使用selenium 打开 Firefox 浏览器
from selenium from webdriver
borwser = webdriver.Firefox()
borwser.quit()
- 安装了python3, 使用pip安装了selenium, 但是在使用时, 报了”selenium.common.exceptions. WebDriverException: Message: ‘geckodriver’ executable needs to be in PATH.”
- 方法二: 下载geckodriver.exe
- 下载地址:
https://github.com/mozilla/geckodriver/releases
, 根据自己的电脑, 下载的 win64 位的 - 在firefox的安装目录下, 解压
geckodriver
, 然后将该路径添加到path环境变量下, 不报这个错了 - Firefox 前段工具
- firebug 先改为 Firefox Development Edition
from selenium import webdriver
b = webdriver.Chrome()
- setup Chrome
- chromedriver.exe
- chromedriver.exe 解压到
C:\Program Files\Chrome\Application
目录下 - 配置环境变量
# 打开网页
b.get('http://www.baidu.com)
# 输入title
b.title
# 是否包含 百度字符串
'百度' in b.title
# 在浏览器打开地址 http://www.f.cc
b.current_url
元素定位
元素名称 |
webdriver API |
id |
find_element_by_id() |
name |
find_element_by_name() |
class name |
find_element_by_class_name() |
tag name |
find_element_by_tag_name() 紧返回第一个标签 |
link text |
find_element_by_link_text() 精确定位 |
partial link text |
find_element_by_partial_link_text() 模糊文本 |
xpath |
find_element_by_xpath() |
css selector |
find_element_by_css_selector() |
- find_element(“id|name”, “value”)
- 元素操作
- clear() 清楚元素内容
- send_keys(‘追加内容’) 模拟按键输入
- click() 点击
- submit() 提交表单
- b.back()
xpath
ele = b.find_element_by_xpath('/html')
ele.text
ele = b.find_element_by_xpath('/html/body/form/input')
ele.get_attribute('type')
'text'
ele.get_attribute('name')
'firstname'
ele.send_keys("张")
# 第二个输入框(编号1开始)
ele1 = b.find_element_by_xpath('/html/body/form/input[2]')
ele2.get_attribute('name')
'firstname'
/xx/yy
根据绝对路径选择元素//xxx
整个文档扫描, 找到所有xx元素//xx/yy
所有父元素为xx的yy元素.
选取当前节点的父元素节点..
选取父元素地址//xx[@id]
选取所有元素中有 id 属性的元素//input[not(@id)]
//xx[@id=yy]
选取所有 xx 元素id 属性为 yy 的元素//*
所有元素
ele3 = b.find_element_by_xpath('//form//input/..')
ele3.tag_name
ele3 = b.find_element_by_xpath('//*')
ele3.tag_name
'html'
ele3 = b.find_element_by_xpath('//*[count(input)=2]')
ele3.tag_name
'form'
表达式 |
结果 |
//*[count(tag)=2] |
统计tag元素个数=2节点 |
//*[local-name()=’xx’] |
找到tag伪xxx的元素 |
//*[starts-with(local-name(), ‘x’)] |
找到所有 tag 以 x 开头的元素 |
//*[contains(local-name(), ‘x’)] |
找到所有 tag 包含 x 的元素 |
//*[string-length(local-name()) = 3] |
找到所有 tag 长度为 3 的元素 |
//xx |
/yy 多个路径查找 |
ele = b.find_element_by_xpath('//*[local-name()="input"]')
ele.tag_name
ele.get_attribute('name')
'age'
ele = b.find_element_by_xpath('//input')
ele.get_attribute('name')
'age'
ele = b.find_element_by_xpath('//*[starts-with(local-name(), "i")]')
ele.tag_name
'input'
ele = b.fidn_element_by_xpath('//*[contains(local-name)(, "i")]')
ele.get_attribute('name')
ele.tag_name
'title'
ele = b.find_element_by_xpath('//*[contains(local-name(), "i")][last()]')
ele.tag_name
ele b = b.find_element_by_xpath('//form//*[contains(local-name(), "i")]')
ele.tag_name
'input'
ele.get_attribute('name')
'firstname'
ele b = b.find_element_by_xpath('//form//*[contains(local-name(), "i")][last()]')
ele.tag_name
'input'
ele.get_attribute('name')
'lastname'
ele b = b.find_element_by_xpath('//form//*[contains(local-name(), "i")][last()-1]')
ele = b.find_element_by_xpath('//title | //input[last()]')
ele.tag_name
'title'
webdriver 模块对浏览器进行操作
# 窗口全屏
b.maximize_window()
鼠标事件
- from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver)
: 用于生成模拟用户行为perform()
: 执行存储行为expression
| introductioncontext_click
右击事件double_click
双击事件drag_and_drop
拖动move_to_element()
鼠标停在一个元素上click_and_hold
按下鼠标左键在一个元素上
from selenium.webdriver.common.action_chains import ActionChains
ele = b.find_element_by_link_text('学习列表')
ActionChains(b).move_to_element(ele).perform()
sub_ele = b.find_element_by_link_text('selenium 学习')
sub_ele.click()
键盘事件
- from selenium.webdriver.common.keys import Keys
- send_keys(Keys. BACK_SPACE)
退格键
- send_keys(Keys. CONTRL, ‘a’)
全选
- send_keys(Keys. CONTRL, ‘v’)
粘贴
- send_keys(Keys. CONTRL, ‘c’)
复制
- send_keys(Keys. CONTRL, ‘x’)
剪切
- send_keys(Keys. ENTER)
回车
s.send_keys('python')
from selenium.webdriver.common.keys import Keys
s.clear()
s.send_keys('python1')
s.send_keys(Keys.BACKSPACE) # 去掉1
s.send_kyes(Keys.CONTRL, 'a') # 选择
s.send_kyes(Keys.CONTRL, 'x') # 复制
s.send_kyes(Keys.CONTRL, 'v') # 粘贴
ele = b.find_element_by_link_text('Python Web开发')
ele.text
'Python Web开发'
# 列出所有的句柄
b.window_handles
# 当前句柄
b.current_window_handle
# 切换窗口
b.switch_to_window(d.window.handlers[1])
# 关闭句柄
b.close()
# 退出
b.quit()
测试脚本中的等待方法
- 等待是为了使脚本执行更加稳定
- 常用的休眠方式:time 模块的 sleep 方法
selenium 模块中的等待方法
- implicitly_wait() 设置 webdriver 等待时间; 多个操作
- WebDriverWait 等待条件满足后者超时后退出
from selenium.webdriver.support.ui import WebDriverWait
一个操作
d.get('http://www.baidu.com')
d.find_element_by_id('kw').send_keys('lingyima')
d.implicitly_wait(5) # 查找5秒钟之后没有找到,则退出
d.find_element_by_id('kw1') # 不存在的元素
from selenium.webdriver.support.ui import WebDriverWait
help(WebDriverWait)
def get_ele_times(driver, times, func):
return WebDriverWait(driver, times).until(func)
def main():
ele_login = get_ele_times(b, 10,
lambda b: b.find_element_by_class_name("login"))
ele_login.click()
# WebDriverWait: poll_frequency->check->until->
Alert()对象
- switch_to_alert()
切到 alter
, 返回一个 alert对象 - accept
确认
- dismiss
取消
- send_keys()
有输入框才能使用, 否则报错
f.find_element_by_id('alert').click()
alter = b.switch_to_alert()
type(alter)
<class 'selenium.webdriver.common.alert.Alert'>
alter.text
alter.driver
alter.accpet() # 确认弹出框
alter.dismiss() # 取消弹出框