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 webdriverborwser = 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 webdriverb = webdriver.Chrome()
- setup Chrome
- chromedriver.exe
- chromedriver.exe 解压到
C:\Program Files\Chrome\Application 目录下 - 配置环境变量
# 打开网页b.get('http://www.baidu.com)# 输入titleb.title# 是否包含 百度字符串'百度' in b.title# 在浏览器打开地址 http://www.f.ccb.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.textele = 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_nameele3 = 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_nameele.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_nameele 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 ActionChainsele = 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 Keyss.clear()s.send_keys('python1')s.send_keys(Keys.BACKSPACE) # 去掉1s.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 WebDriverWaithelp(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.textalter.driveralter.accpet() # 确认弹出框alter.dismiss() # 取消弹出框