Web自动化框架selenium的介绍与使用

介绍

selenium 是一个 web 的自动化测试工具,可以模拟人工Web浏览,, 适合用于自动化处理和爬虫任务, 该框架支持C、 java、ruby、python等多种语言, 支持三大操作系统和各种常见浏览器

官方文档:

接下来以python为例, 给大家介绍selenium 的具体使用

selenium使用前准备

  1. 框架安装

    1
    pip install selenium
  2. web驱动安装

    推荐下载使用谷歌或火狐浏览器, 然后根据浏览器版本安装与之对应版本的驱动, 这里我使用的是谷歌浏览器

    打开浏览器设置, 查看浏览器版本:

    在这里插入图片描述

    然后下载驱动:

    ChromeDriver下载地址

    在这里插入图片描述

    将下载的驱动解压到以下目录:

    1
    2
    Win:复制webdriver到Python安装目录下
    Mac:复制webdriver到/usr/local/bin目录下

    如果是火狐浏览器同理,以下是两大类浏览器驱动下载备用链接:

    Chrome ( chromedriver ) Firefox ( geckodriver )
    官方下载 官方下载
    淘宝镜像 淘宝镜像
    备用下载 备用下载

    接下来 我们开始引入框架并使用

  3. 框架引入

    1
    from selenium import webdriver

开始使用

  1. 自动打开浏览器访问某个网页

    1
    2
    3
    4
    from selenium import webdriver

    browser = webdriver.Chrome()
    browser.get('http://www.baidu.com/')
  2. 获取网页的源码

    1
    2
    3
    4
    5
    from selenium import webdriver

    browser = webdriver.Chrome()
    browser.get('http://www.baidu.com/')
    print(browser.page_source)
  3. 不打开浏览器获取网页源码

    很多情况下我们只需要让程序在后台静默执行就行, 不需要频繁开启浏览器, 那么我们需要对驱动进行相关设置, 如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    from selenium import webdriver
    chrome_options = webdriver.ChromeOptions()
    # 使用headless无界面浏览器模式
    chrome_options.add_argument('--headless') #增加无界面选项
    chrome_options.add_argument('--disable-gpu') #如果不加这个选项,有时定位会出现问题

    browser = webdriver.Chrome(chrome_options=chrome_options)
    browser.get('http://www.baidu.com/')
    print(browser.page_source)
  4. 以指定配置启动浏览器

    常用浏览器有常用的一些设置, 如果我们想在自动化的过程中加载进来可以使用add_argument方法, 如下:

    1
    2
    3
    4
    5
    #coding=utf-8
    from selenium import webdriver
    option = webdriver.ChromeOptions()
    option.add_argument('--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data') #指定数据目录
    driver=webdriver.Chrome(chrome_options=option)
  5. 指定驱动的目录

    除了将下载的驱动存放到系统指定目录使用之外, 我们还可以直接指定驱动的存放路径, 方便我们临时测试多个不同的驱动效果, 配置方法如下:

    1
    2
    3
    driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'
    # 初始化一个driver,并且指定chromedriver的路径
    driver = webdriver.Chrome(executable_path=driver_path)
  6. webdriver常用api汇总

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    browser = webdriver.Chrome()

    browser.get_cookies() #获取所有的cookies
    browser.page_source #获取网页源码
    browser.delete_all_cookies() #删除所有cookies
    browser.delete_cookie(key) #删除某个cookies
    browser.implicitly_wait(10) #设置超时时间
    browser.execute_script("window.open('https://www.douban.com/')") #打开一个新页面
    browser.title #获取网页标题
    browser.current_url #获取当前网页url
    browser.capabilities['version'] #获取浏览器版本号
    browser.maximize_window() #浏览器最大化
    browser.minimize_window() #浏览器最小化
    browser.set_window_size(480, 800) #设置浏览器宽高
    browser.forword() # 页面前进
    browser.back() #页面后退
    browser.close() #关闭当前页面
    browser.quit() #退出整个浏览器

    注意: 如果访问一些需要有cookie验证的页面,我们可以先访问主页,然后再访问详情页,webdriver会自动携带cookie

  7. ChromeOptions常用函数汇总

    1
    2
    #设置代理ip
    options.add_argument("--proxy-server=http://110.73.2.248:8123")
  1. 网页元素定位查找

    • 通过元素ID进行定位

      1
      browser.find_element_by_id()
    • 通过标签名的方式进行定位

      1
      browser.find_element_by_tag_name("input")
    • 通过class的方式进行定位

      1
      browser.find_element_by_class_name("xxx")
    • 通过css方式定位

      1
      browser.find_element_by_css_selector("xxx")
  1. 事件模拟

    主要分为键盘事件和鼠标事件

    1. 键盘事件

      通过 send_keys()调用键盘按键, 比如:

      1
      2
      3
      4
      from selenium.webdriver.common.keys import Keys

      send_keys(Keys.TAB) # TAB
      send_keys(Keys.ENTER) # 回车

      参考代码如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      #coding=utf-8 
      from selenium import webdriver
      from selenium.webdriver.common.keys import Keys #需要引入 keys 包
      import os,time

      driver = webdriver.Firefox()
      driver.get("http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fwebcloud .kuaibo.com%2F")

      time.sleep(3)
      driver.maximize_window() # 浏览器全屏显示

      driver.find_element_by_id("user_name").clear()
      driver.find_element_by_id("user_name").send_keys("fnngj")

      #tab 的定位相相于清除了密码框的默认提示信息,等同上面的 clear()
      driver.find_element_by_id("user_name").send_keys(Keys.TAB)
      time.sleep(3)
      driver.find_element_by_id("user_pwd").send_keys("123456")

      #通过定位密码框,enter(回车)来代替登陆按钮
      driver.find_element_by_id("user_pwd").send_keys(Keys.ENTER)

      #也可定位登陆按钮,通过 enter(回车)代替 click()
      driver.find_element_by_id("login").send_keys(Keys.ENTER)
      time.sleep(3)

      driver.quit()

      键盘组合键的用法:

      1
      2
      #ctrl+a 全选输入框内容 
      driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
      1
      2
      #ctrl+x 剪切输入框内容 
      driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
  1. 鼠标事件

    鼠标事件一般包括鼠标右键、双击、拖动、移动鼠标到某个元素上等等。 需要引入ActionChains

    引入方法:

    1
    from selenium.webdriver.common.action_chains import ActionChains

    ActionChains 常用方法:

    1
    2
    3
    4
    5
    6

    perform() 执行所有ActionChains 中存储的行为;
    context_click() 右击;
    double_click() 双击;
    drag_and_drop() 拖动;
    move_to_element() 鼠标悬停。

    鼠标双击示例:

    1
    2
    3
    4
    #定位到要双击的元素
    qqq =driver.find_element_by_xpath("xxx")
    #对定位到的元素执行鼠标双击操作
    ActionChains(driver).double_click(qqq).perform()

    鼠标拖放示例:

    1
    2
    3
    4
    5
    6
    #定位元素的原位置 
    element = driver.find_element_by_name("source")
    #定位元素要移动到的目标位置
    target = driver.find_element_by_name("target")
    #执行元素的移动操作
    ActionChains(driver).drag_and_drop(element, target).perform()
  1. 特殊定位

    1. iframe定位

      1
      2
      #先找到到 ifrome1(id = f1)
      browser.switch_to_frame("f1")
    2. 内嵌窗口定位:

      1
      browser.switch_to_window("f1")

附加内容

  1. Python Webdriver Exception速查表

    webdriver在使用过程中可能会出现各种异常,我们需要了解该异常并知道如何进行异常处理。

    异常 描述
    WebDriverException 所有webdriver异常的基类,当有异常且不属于下列异常时抛出
    InvalidSwitchToTargetException 下面两个异常的父类,当要switch的目标不存在时抛出
    NoSuchFrameException 当你想要用switch_to.frame()切入某个不存在的frame时抛出
    NoSuchWindowException 当你想要用switch_to.window()切入某个不存在的window时抛出
    NoSuchElementException 元素不存在,一般由find_element与find_elements抛出
    NoSuchAttributeException 一般你获取不存在的元素属性时抛出,要注意有些属性在不同浏览器里是有不同的属性名的
    StaleElementReferenceException 指定的元素过时了,不在现在的DOM树里了,可能是被删除了或者是页面或iframe刷新了
    UnexpectedAlertPresentException 出现了意料之外的alert,阻碍了指令的执行时抛出
    NoAlertPresentException 你想要获取alert,但实际没有alert出现时抛出
    InvalidElementStateException 下面两个异常的父类,当元素状态不能进行想要的操作时抛出
    ElementNotVisibleException 元素存在,但是不可见,不可以与之交互
    ElementNotSelectableException 当你想要选择一个不可被选择的元素时抛出
    InvalidSelectorException 一般当你xpath语法错误的时候抛出这个错
    InvalidCookieDomainException 当你想要在非当前url的域里添加cookie时抛出
    UnableToSetCookieException 当driver无法添加一个cookie时抛出
    TimeoutException 当一个指令在足够的时间内没有完成时抛出
    MoveTargetOutOfBoundsException actions的move操作时抛出,将目标移动出了window之外
    UnexpectedTagNameException 获取到的元素标签不符合要求时抛出,比如实例化Select,你传入了非select标签的元素时
    ImeNotAvailableException 输入法不支持的时候抛出,这里两个异常不常见,ime引擎据说是仅用于linux下对中文/日文支持的时候
    ImeActivationFailedException 激活输入法失败时抛出
    ErrorInResponseException 不常见,server端出错时可能会抛
    RemoteDriverServerException 不常见,好像是在某些情况下驱动启动浏览器失败的时候会报这个错

  2. Xpath&Css定位方法速查表

    描述 Xpath Css
    直接子元素 //div/a div > a
    子元素或后代元素 //div//a div a
    以id定位 //div[@id=’idValue’]//a div#idValue a
    以class定位 //div[@class=’classValue’]//a div.classValue a
    同级弟弟元素 //ul/li[@class=’first’]/following- ul>li.first + li
    属性 //form/input[@name=’username’] form input[name=’username’]
    多个属性 //input[@name=’continue’ and input[name=’continue’][type=’button
    第4个子元素 //ul[@id=’list’]/li[4] ul#list li:nth-child(4)
    第1个子元素 //ul[@id=’list’]/li[1] ul#list li:first-child
    最后1个子元素 //ul[@id=’list’]/li[last()] ul#list li:last-child
    属性包含某字段 //div[contains(@title,’Title’)] div[title*=”Title”]
    属性以某字段开头 //input[starts-with(@name,’user’)] input[name^=”user”]
    属性以某字段结尾 //input[ends-with(@name,’name’)] input[name$=”name”]
    text中包含某字段 //div[contains(text(), ‘text’)] 无法定位
    元素有某属性 //div[@title] div[title]
    父节点 //div/.. 无法定位
    同级哥哥节点 //li/preceding-sibling::div[1] 无法定位

本文为作者原创转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%