一、简介

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

01-22 02:57