selenium用法详解

selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。 selenium用于爬虫,主要是用来解决javascript渲染的问题

基本框架

控制chrome浏览器,访问百度,并搜索关键词Python,获取搜索结果

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.common.keys import Keys
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from selenium.webdriver.support.wait import WebDriverWait
  7. import time
  8. browser=webdriver.Chrome()
  9. try:
  10. browser.get("https://www.baidu.com")
  11. input=browser.find_element_by_id("kw")
  12. input.send_keys("Python")
  13. input.send_keys(Keys.ENTER)
  14. wait=WebDriverWait(browser,10)
  15. wait.until(EC.presence_of_element_located((By.ID,"content_left")))
  16. print(browser.current_url)
  17. print(browser.get_cookies())
  18. print(browser.page_source)
  19. time.sleep(10)
  20. finally:
  21. browser.close()

运行结果如下: 示例 输出

详细用法

声明浏览器对象

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. #声明谷歌、Firefox、Safari等浏览器
  4. browser=webdriver.Chrome()
  5. browser=webdriver.Firefox()
  6. browser=webdriver.Safari()
  7. browser=webdriver.Edge()
  8. browser=webdriver.PhantomJS()

访问页面

  1. #_*_coding: utf-8_*_
  2. from selenium import webdriver
  3. browser=webdriver.Chrome()
  4. browser.get("http://www.taobao.com")
  5. print(browser.page_source)
  6. browser.close()

查找单个元素

  1. #_*_coding: utf-8_*_
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. browser=webdriver.Chrome()
  5. browser.get("http://www.taobao.com")
  6. input_first=browser.find_element_by_id("q")
  7. input_second=browser.find_element_by_css_selector("#q")
  8. input_third=browser.find_element(By.ID,"q")
  9. print(input_first,input_second,input_first)
  10. browser.close()

查找多个元素

  1. #_*_coding: utf-8_*_
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. browser=webdriver.Chrome()
  5. browser.get("http://www.taobao.com")
  6. lis=browser.find_element_by_css_selector("li")
  7. lis_c=browser.find_element(By.CSS_SELECTOR,"li")
  8. print(lis,lis_c)
  9. browser.close()

元素的交互操作

对获取到的元素调用交互方法

  1. #_*_coding: utf-8_*_
  2. from selenium import webdriver
  3. import time
  4. browser=webdriver.Chrome()
  5. browser.get("https://www.taobao.com")
  6. input=browser.find_element_by_id("q")
  7. input.send_keys("iPhone")
  8. time.sleep(10)
  9. input.clear()
  10. input.send_keys("iPad")
  11. button=browser.find_element_by_class_name("btn-search")
  12. button.click()
  13. time.sleep(10)
  14. browser.close()

交互动作

把动作附加到交互链中

  1. #_*_coding: utf-8_*_
  2. from selenium import webdriver
  3. from selenium.webdriver import ActionChains
  4. import time
  5. from selenium.webdriver.common.alert import Alert
  6. browser=webdriver.Chrome()
  7. url="http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
  8. browser.get(url)
  9. #切换到目标元素所在的frame
  10. browser.switch_to.frame("iframeResult")
  11. #确定拖拽目标的起点
  12. source=browser.find_element_by_id("draggable")
  13. #确定拖拽目标的终点
  14. target=browser.find_element_by_id("droppable")
  15. #形成动作链
  16. actions=ActionChains(browser)
  17. actions.drag_and_drop(source,target)
  18. #执行
  19. actions.perform()
  20. '''
  21. 1.先用switch_to_alert()方法切换到alert弹出框上
  22. 2.可以用text方法获取弹出的文本 信息
  23. 3.accept()点击确认按钮
  24. 4.dismiss()相当于点右上角x,取消弹出框
  25. '''
  26. t=browser.switch_to_alert()
  27. print(t.text)
  28. t.accept()
  29. time.sleep(10)
  30. browser.close()

执行javascript

下面的例子是执行就是,拖拽进度条到底,并弹出提示框

  1. #_*_coding: utf-8_*_
  2. from selenium import webdriver
  3. browser=webdriver.Chrome()
  4. browser.get("https://www.zhihu.com/explore")
  5. browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
  6. browser.execute_script("alert('To Button')")
  7. browser.close()

获取元素信息

获取属性

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. browser=webdriver.Chrome()
  4. url="https://www.zhihu.com/explore"
  5. browser.get(url)
  6. logo=browser.find_element_by_id("zh-top-link-logo")
  7. print(logo)
  8. print(logo.get_attribute("class"))
  9. browser.close()

获取文本

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. browser=webdriver.Chrome()
  4. url="https://www.zhihu.com/explore"
  5. browser.get(url)
  6. logo=browser.find_element_by_id("zh-top-link-logo")
  7. print(logo)
  8. print(logo.text)
  9. browser.close()

获取ID、位置、大小和标签名

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. browser=webdriver.Chrome()
  4. url="https://www.zhihu.com/explore"
  5. browser.get(url)
  6. logo=browser.find_element_by_id("zh-top-link-logo")
  7. print(logo)
  8. #id
  9. print(logo.id)
  10. #位置
  11. print(logo.location)
  12. #标签名
  13. print(logo.tag_name)
  14. #大小
  15. print(logo.size)
  16. browser.close()

等待

隐式等待

当使用了隐式等待执行测试的时候,如果webdriver没有在DOM中找到元素,将继续等待,超过设定的时间后则抛出找不到元素的异常,换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认时间为0.

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. browser=webdriver.Chrome()
  4. url="https://www.zhihu.com/explore"
  5. browser.get(url)
  6. browser.implicitly_wait(10)
  7. logo=browser.find_element_by_id("zh-top-link-logo")
  8. print(logo)
  9. browser.close()

显示等待

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.ui import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. browser=webdriver.Chrome()
  7. url="https://www.taobao.com"
  8. browser.get(url)
  9. wait=WebDriverWait(browser,10)
  10. input=wait.until(EC.presence_of_element_located((By.ID,"q")))
  11. button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn-search")))
  12. print(input,button)
  13. browser.close()

浏览器的前进和后退

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. import time
  4. browser=webdriver.Chrome()
  5. browser.get("https://www.taobao.com")
  6. browser.get("https://www.baidu.com")
  7. browser.get("https://www.python.org")
  8. browser.back()
  9. time.sleep(1)
  10. browser.forward()
  11. browser.close()

cookies的处理

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. import time
  4. browser=webdriver.Chrome()
  5. browser.get("https://www.zhihu.com/explore")
  6. print(browser.get_cookies())
  7. browser.add_cookie({"name":"name","domain":"www.zhihu.com","value":"germey"})
  8. print(browser.get_cookies())
  9. browser.delete_all_cookies()
  10. print(browser.get_cookies())
  11. browser.close()

选项卡管理

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. import time
  4. browser=webdriver.Chrome()
  5. browser.get("https://www.zhihu.com/explore")
  6. browser.execute_script("window.open()")
  7. print(browser.window_handles)
  8. browser.switch_to_window(browser.window_handles[1])
  9. browser.get("https://www.taobao.com")
  10. time.sleep(1)
  11. browser.switch_to_window(browser.window_handles[0])
  12. browser.get("https://python.org")
  13. browser.close()

异常处理

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from selenium.common.exceptions import TimeoutException,NoSuchElementException
  4. browser=webdriver.Chrome()
  5. try:
  6. browser.get("https://www.zhihu.com/explore")
  7. except TimeoutException:
  8. print("Time out")
  9. try:
  10. browser.find_element_by_id("hello")
  11. except NoSuchElementException:
  12. print("No Element")
  13. finally:
  14. browser.close()