Selenium 安装

Web 调试工具介绍与开发环境搭建

  1. 官网下载 https://www.python.org/
  2. 安装 pip: https://pypi.python.org/pypi/pip; 解压pip-version目录之后 执行 python setup.py install
  3. 安装 selenium: pip install -U selenium
  4. 使用selenium 打开 Firefox 浏览器
  1. from selenium from webdriver
  2. borwser = webdriver.Firefox()
  3. 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
  1. from selenium import webdriver
  2. b = webdriver.Chrome()
  • 安装 chrome 浏览器 webdriver
  1. setup Chrome
  2. chromedriver.exe
  3. chromedriver.exe 解压到 C:\Program Files\Chrome\Application 目录下
  4. 配置环境变量
  1. # 打开网页
  2. b.get('http://www.baidu.com)
  3. # 输入title
  4. b.title
  5. # 是否包含 百度字符串
  6. '百度' in b.title
  7. # 在浏览器打开地址 http://www.f.cc
  8. 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

  • /xxx 根节点
  1. ele = b.find_element_by_xpath('/html')
  2. ele.text
  3. ele = b.find_element_by_xpath('/html/body/form/input')
  4. ele.get_attribute('type')
  5. 'text'
  6. ele.get_attribute('name')
  7. 'firstname'
  8. ele.send_keys("张")
  9. # 第二个输入框(编号1开始)
  10. ele1 = b.find_element_by_xpath('/html/body/form/input[2]')
  11. ele2.get_attribute('name')
  12. 'firstname'
  • /xx/yy 根据绝对路径选择元素
  • //xxx 整个文档扫描, 找到所有xx元素
  • //xx/yy 所有父元素为xx的yy元素
  • . 选取当前节点的父元素节点
  • .. 选取父元素地址
  • //xx[@id] 选取所有元素中有 id 属性的元素
  • //input[not(@id)]
  • //xx[@id=yy] 选取所有 xx 元素id 属性为 yy 的元素
  • //* 所有元素
  1. ele3 = b.find_element_by_xpath('//form//input/..')
  2. ele3.tag_name
  3. ele3 = b.find_element_by_xpath('//*')
  4. ele3.tag_name
  5. 'html'
  6. ele3 = b.find_element_by_xpath('//*[count(input)=2]')
  7. ele3.tag_name
  8. '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 多个路径查找
  1. ele = b.find_element_by_xpath('//*[local-name()="input"]')
  2. ele.tag_name
  3. ele.get_attribute('name')
  4. 'age'
  5. ele = b.find_element_by_xpath('//input')
  6. ele.get_attribute('name')
  7. 'age'
  8. ele = b.find_element_by_xpath('//*[starts-with(local-name(), "i")]')
  9. ele.tag_name
  10. 'input'
  11. ele = b.fidn_element_by_xpath('//*[contains(local-name)(, "i")]')
  12. ele.get_attribute('name')
  13. ele.tag_name
  14. 'title'
  15. ele = b.find_element_by_xpath('//*[contains(local-name(), "i")][last()]')
  16. ele.tag_name
  17. ele b = b.find_element_by_xpath('//form//*[contains(local-name(), "i")]')
  18. ele.tag_name
  19. 'input'
  20. ele.get_attribute('name')
  21. 'firstname'
  22. ele b = b.find_element_by_xpath('//form//*[contains(local-name(), "i")][last()]')
  23. ele.tag_name
  24. 'input'
  25. ele.get_attribute('name')
  26. 'lastname'
  27. ele b = b.find_element_by_xpath('//form//*[contains(local-name(), "i")][last()-1]')
  28. ele = b.find_element_by_xpath('//title | //input[last()]')
  29. ele.tag_name
  30. 'title'

webdriver 模块对浏览器进行操作

  1. # 窗口全屏
  2. b.maximize_window()

鼠标事件

  • from selenium.webdriver.common.action_chains import ActionChains
  • ActionChains(driver): 用于生成模拟用户行为
  • perform(): 执行存储行为
  • expression | introduction
  • context_click 右击事件
  • double_click 双击事件
  • drag_and_drop 拖动
  • move_to_element() 鼠标停在一个元素上
  • click_and_hold 按下鼠标左键在一个元素上
  1. from selenium.webdriver.common.action_chains import ActionChains
  2. ele = b.find_element_by_link_text('学习列表')
  3. ActionChains(b).move_to_element(ele).perform()
  4. sub_ele = b.find_element_by_link_text('selenium 学习')
  5. 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) 回车
  1. s.send_keys('python')
  2. from selenium.webdriver.common.keys import Keys
  3. s.clear()
  4. s.send_keys('python1')
  5. s.send_keys(Keys.BACKSPACE) # 去掉1
  6. s.send_kyes(Keys.CONTRL, 'a') # 选择
  7. s.send_kyes(Keys.CONTRL, 'x') # 复制
  8. s.send_kyes(Keys.CONTRL, 'v') # 粘贴
  9. ele = b.find_element_by_link_text('Python Web开发')
  10. ele.text
  11. 'Python Web开发'
  12. # 列出所有的句柄
  13. b.window_handles
  14. # 当前句柄
  15. b.current_window_handle
  16. # 切换窗口
  17. b.switch_to_window(d.window.handlers[1])
  18. # 关闭句柄
  19. b.close()
  20. # 退出
  21. b.quit()

测试脚本中的等待方法

  1. 等待是为了使脚本执行更加稳定
  2. 常用的休眠方式:time 模块的 sleep 方法

selenium 模块中的等待方法

  • implicitly_wait() 设置 webdriver 等待时间; 多个操作
  • WebDriverWait 等待条件满足后者超时后退出 from selenium.webdriver.support.ui import WebDriverWait 一个操作
  1. d.get('http://www.baidu.com')
  2. d.find_element_by_id('kw').send_keys('lingyima')
  3. d.implicitly_wait(5) # 查找5秒钟之后没有找到,则退出
  4. d.find_element_by_id('kw1') # 不存在的元素
  1. from selenium.webdriver.support.ui import WebDriverWait
  2. help(WebDriverWait)
  3. def get_ele_times(driver, times, func):
  4. return WebDriverWait(driver, times).until(func)
  5. def main():
  6. ele_login = get_ele_times(b, 10,
  7. lambda b: b.find_element_by_class_name("login"))
  8. ele_login.click()
  9. # WebDriverWait: poll_frequency->check->until->

Alert()对象

  • switch_to_alert() 切到 alter, 返回一个 alert对象
  • accept 确认
  • dismiss 取消
  • send_keys() 有输入框才能使用, 否则报错
  1. f.find_element_by_id('alert').click()
  2. alter = b.switch_to_alert()
  3. type(alter)
  4. <class 'selenium.webdriver.common.alert.Alert'>
  5. alter.text
  6. alter.driver
  7. alter.accpet() # 确认弹出框
  8. alter.dismiss() # 取消弹出框