一、简介
selenium自动化测试工具,爬虫中主要解决浏览器渲染的问题,过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果。
二、安装
- 模块安装:pip install selenium
- chrome浏览器驱动下载 http://chromedriver.storage.googleapis.com/index.html
驱动对应的浏览器版本 http://npm.taobao.org/mirrors/chromedriver/
三、使用
1.简单使用
from selenium import webdriver
from lxml import etree
import time
chrome = webdriver.Chrome(executable_path = '../chromedriver.exe') #创建浏览器对象
chrome.get('https://www.baidu.com') #访问网页
#解析
page_text = chrome.page_source #获取源代码
tree = etree.HTML(page_text)
#百度搜索
# 1.获取元素,并输入搜索内容
chrome.find_element_by_id('kw').send_keys('哔哩哔哩')
# 2.点击按钮
chrome.find_element_by_id('su').click()
# 或 chrome.find_element_by_link_text('百度一下').click()
time.sleep(2) #防止页面没有加载完,导致解析出错
chrome.find_element_by_xpath('//div[@id="1"]/h3/a[1]').click()
#处理弹出的警告页面 确定accept() 和 取消dismiss()
#chrome.switch_to_alert().accept()
chrome.quit() #关闭 chrom.close()
#前进和后退
chrome.back()
chrome.forward()
2.常用的元素获取方法
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
find_element_by_xxx找的是第一个符合条件的标签,find_elements_by_xxx找的是所有符合条件的标签。
3.执行JavaScriptdaim
chrome.get('https://www.jd.com/')
chrome.execute_script('window.scrollTo(0, document.body.scrollHeight)')
chrome.execute_script('alert("执行完毕")')
4.动作链
webdriver中的ActionChains可以对需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等进行操作。ActionChains方法列表:
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
ActionChains类中的动作要调用perform()才会执行
from selenium import webdriver
import time
chrome = webdriver.Chrome('../chromedriver.exe')
chrome.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
chrome.switch_to.frame('iframeResult')
action = webdriver.ActionChains(chrome)
source = chrome.find_element_by_id('draggable')
'''
方法1
target = chrome.find_element_by_id('droppable')
action.drag_and_drop(source,target)
action.perform()
chrome.switch_to_alert().accept()
'''
#方法2
action.click_and_hold(source)
action.move_by_offset(xoffset=75,yoffset=0).perform()
time.sleep(0.5)
action.release(source).perform()
chrome.switch_to_alert().accept()
5.谷歌无头浏览器
控制浏览器以无界面模式打开
from selenium import webdriver
chrome_options = webdriver.chrome.options.Options()
chrome_options.add_argument('--headless')
path = '../chromedriver.exe'
chrome = webdriver.Chrome(executable_path=path,chrome_options = chrome_options)
控制浏览器窗口大小
有时我们需要对移动站点的样式进行评估,可是浏览器的正常尺寸很显然是不合适的, 此时我们会想将浏览器设置成移动端大小就可以了。WebDriver提供了set_window_size()
方法来设置浏览器大小:
from selenium.webdriver import Chrome
driver = Chrome('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
driver.get('https://www.baidu.com/')
driver.set_window_size(480,800)
除了set_window_size
方法来设置浏览器的大小,WebDriver还提供了一个设置浏览器全屏显示的方法maximize_window()
,其用法与set_window_size()
相同,不同的是maximize_window()
无需传递参数:
from selenium.webdriver import Chrome
driver = Chrome('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
driver.get('https://www.baidu.com/')
driver.maximize_window()
值得注意的是,在定位元素的时候,有些网页如果不是全屏展示时,将由可能定位不准!!!
控制浏览器前进与后退
在使用浏览器浏览网页时,浏览器提供了前进和后退的按钮,可以方便的在浏览过的网页之间进行切换,WebDriver也提供了相应的back()
和forward()
方法来模拟后退和前进按钮,下面举个简单的栗子来演示这两个方法的使用:
from selenium.webdriver import Chrome
driver = Chrome('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
driver.get('https://www.baidu.com')
driver.get('https://www.cnblogs.com/')
# 后退至百度页面
driver.back()
# 前进至博客页面
driver.forward()
刷新页面
有时候需要手动刷新(F5)页面,WebDriver也提供了相应的方法refresh()
,使用起来很简单,如下:
driver.refresh()
窗口截屏
自动化用例是由程序去执行的,因此有些时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能够对当前窗口截图保存,那么通过图片就可以非常直观的看出出错的原因。WebDriver提供了截图函数get_screenshot_as_file()
来截取当前窗口:
from selenium.webdriver import Chrome
driver = Chrome('C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
driver.get("https://www.baidu.com/")
driver.get_screenshot_as_file("abc.png")
当使用窗口截屏功能时,图片的扩展名必须是png