• selenium自动化测试爬取动态页面大全


      这里之讲解用法,安装配置就不详细讲解了。我比较喜欢的浏览器驱动是ChromeDriver和无界面的PhantomJS。

    一:浏览器信息测试

    1.初始化浏览器

      用下面的代码初始化浏览器

    from selenium import webdriver
    
    # 把浏览器对象赋值为browser对象,然后就可以进行模拟浏览器操作
    browser = webdriver.Chrome()
    

    2.访问网页

    browser.get('url地址')
    # 这个是打印网页源代码
    print(browser.page_source)
    browser.close() # 处理完后要关闭这个对象
    

    二:查找结点

      我们要想执行某个操作,比如填充表单,模拟点击等,或者向某个输入框输入文字,首先要知道位置,而selenium提供了一系列的查找节点的方法,如下。

    1.单个节点

    查找方法 说明
    find_element_by_id 通过id来查找标签
    find_element_by_name 通过name属性来查找标签
    find_element_by_xpath 通过xpath来查找标签
    find_element_by_link_text 通过链接的文字来查找标签
    find_element_by_partial_link_text 通过链接的关键字来查找标签
    find_element_by_tag_name 通过标签名来查找标签
    find_element_by_class_name 通过class的属性来查找标签
    find_element_by_css_selector 通过css选择器来查找标签

    还有一种通用方法是find_element()传两个参数,一个是By.查找方式,一个是值,比如find_element(By.ID,id)和find_element_by_id结果一致。

    2.多个节点

      查找多个节点的时候,直接在查找单个节点的方法中加上s,如find_elements_by_name或者find_elements(By.NAME,name),列表中的每一个节点都是WebElement类型。

    三:测试动作

    1.简单的交互

      selenium可以驱动浏览器执行一些操作,就是让浏览器模拟执行一些动作。下面是一些常见方法总结。

    方法 说明
    send_keys 输入文字
    clear 清空文字
    click 点击按钮

    2.特殊的交互

      有一些交互操作没有特定的执行对象,比如鼠标拖曳,键盘按键等,这些相对复杂的动作用动作链的方式执行。这里暂时用不到,先略过。

    3.模拟运行JavaScript

      用execute_script()方法可以模拟运行JavaScript,基本上所有复杂的动作都可以用执行JavaScript的方式来实现。

    四:获取节点信息

      用 get_attribute() 方法来获取节点的属性。
      用 text 属性来获取节点的文本值。
      用 id 属性来获取节点id。
      用 location 属性来获取节点在页面中的相对位置。
      用 tag_name 属性来获取标签名称。
      用 size 属性来获取节点的大小。

    五:切换子页面Frame

      网页有一种节点是iframe,也就是子Frame,相当于页面的子页面。网页打开的时候,默认是在父级Frame里面进行操作,要获取子Frame的节点,需要用到switch_to.frame()方法进行切换。
      用switch_to.parent_frame()可以获取到父页面的内容。

    六,延时请求

      在selenium中,get()方法会在网页框架加载完成后结束执行,此时如果获取网页源码,可能并不是浏览器完全加载的页面,如果有额外的ajax请求,网页源代码也不一定能成功获取,需要延时等待一定时间,确保 动态网页源代码 全部加载出来。
      等待方式有两种,一种是隐式等待,一种是显式等待。

    1.隐式等待

      隐式等待就是一般的等待,在执行测试的时候,先等待完之后,再进行接下来的步骤,用implicitly_wait(),参数是时间。

    2.显式等待

      隐式等待的效果并没有那么好,只是规定了一个固定的时间,而网页的加载时间会受到网络条件的影响。
      这里有一个显式等待的方法就是指定要查找的节点,然后指定一个最长等待时间,在规定的时间内加载出来就返回,加载不出来,则抛出异常。
    示例如下:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as  EC
    
    browser = webdriver.Chrome()
    browser.get('url地址')
    # 先指定最长等待时间为20s
    wait = WebDriverWait(browser,20)
    # 传入等待条件expected_conditions,这里的presence_of_element_located代表节点出现的意思
    input = wait.until(EC.presence_of_element_located(By.ID,'a'))
    # 按钮等待条件,这里的element_to_be_clickable表示可点击的,10秒内能点击,就成功
    button = wait.until(EC.element_to_be_clickable(By.CSS_SELECTOR,'.btn-ss'))
    print(input,button)
    

    下面是 所有的等待条件

    等待条件 说明
    title_is 标题是某内容
    title_contains 标题包含某内容
    presence_of_all_elements_located 某个节点是否加载出来
    visibility_of_element_located 某个节点是否可见
    visibility_of 某个节点是否可见,传入节点对象
    presence_of_all_elements_located 所有节点加载出来
    text_to_be_present_in_element 某个节点文本包含某文字
    text_to_be_present_in_element_value 某个节点值包含某文字
    frame_to_be_available_and_switch_to_it 加载并切换
    invisibility_of_element_located 节点不可见
    element_to_be_clickable 节点可点击
    staleness_of 判断一个节点是否存在DOM,可判断页面是否已刷新
    element_to_be_selected 节点可选择,传入节点对象
    element_located_to_be_selected 节点可选择,传入定位元组
    element_selection_state_to_be 传入节点对象以及状态,相等返回True,否则返回False
    element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
    alert_is_present 是否出现警告

    七:前进和后退

      selenium测试用back()方法后退,用forward()方法前进。

    八:Cookies

      使用selenium可以方便地对Cookies进行操作。
      用get_cookies()方法获取所有的Cookies。
      用add_cookies()方法增加Cookies。
      用delete_all_cookies()和delete_cookies()方法删除Cookies。

    八:选项卡处理

      在访问网页的时候,会开启一个个选项卡,在selenium中也可以对选项卡进行操作。

    browser.execute_script('windows.open()')
    print(window_handles)
    browser.switch_to_window(browser.window_handles[1])
    

      用execute_script方法执行JavaScript语句,这里的window_handles获取当前开启的所有选项卡,返回的是选项卡的代号列表。用browser.window_handles[index]即可以跳转到index索引对应的选项卡。

    九:捕获异常

      捕获异常是经常要用到的方法,语句是try-except-finally,对于不同的错误,无论是网络连接,代码运行时间超时,还是数据未找到,都十分有用。

  • 相关阅读:
    转:史上最最佳软件开发实践指导
    django--rtbac权限管理
    爬虫之selenium模块
    爬虫之request模块
    爬虫基础概念
    django--cookie与session
    python--深浅copy
    基于JaCoCo的Android测试覆盖率统计(二)
    jacoco统计Android手工测试覆盖率并自动上报服务器
    macOS10.12部署sonarqube5.6.3
  • 原文地址:https://www.cnblogs.com/ITXiaoAng/p/12054686.html
Copyright © 2020-2023  润新知