当前位置:主页 > 查看内容

基于Pythion的Selenium自动化测试(一)搭建环境、常用Webdriver

发布时间:2021-04-22 00:00| 位朋友查看

简介:申明资料来源于网络及书本通过理解、实践、整理成学习笔记。 文章目录 测试环境搭建 自动化访问百度 定位元素 控制浏览器 简单元素操作 鼠标事件 键盘事件 QQ邮箱登录 设置元素等待 显式等待 隐式等待 expected_conditions类 测试环境搭建 安装python 下载地……

申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。

测试环境搭建

  1. 安装python;
    下载地址(https://www.python.org/)
    安装成功之后打开cmd输入如下代码显示python安装成功

    C:\Users\1>python
    Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    
  2. 安装pip;
    安装成功之后打开cmd输入如下代码显示pip安装成功

    C:\Users\1>pip -V
    pip 20.2.3 from d:\python\lib\site-packages\pip (python 3.9)	
    
  3. 安装Selenium;
    打开cmd输入如下代码显示pip安装成功

    C:\Users\1>pip install selenium
    Collecting selenium
      Downloading selenium-3.141.0-py2.py3-none-any.whl (904 kB)
         |████████████████████████████████| 904 kB 16 kB/s
    Collecting urllib3
      Downloading urllib3-1.26.4-py2.py3-none-any.whl (153 kB)
         |████████████████████████████████| 153 kB 2.0 kB/s
    Installing collected packages: urllib3, selenium
    Successfully installed selenium-3.141.0 urllib3-1.26.4
    WARNING: You are using pip version 20.2.3; however, version 21.0.1 is available.
    You should consider upgrading via the 'd:\python\python.exe -m pip install --upgrade pip' command.
    
  4. 下载浏览器驱动防止python文件夹下
    谷歌浏览器驱动:https://npm.taobao.org/mirrors/chromedriver/
    火狐浏览器驱动:https://npm.taobao.org/mirrors/geckodriver/
    IE浏览器驱动:http://selenium-release.storage.googleapis.com/index.html
    在这里插入图片描述

自动化访问百度

  • *防止乱码,支持中文(必要)

    # coding=utf-8
    
  • *导入Selenium的WebDriver包(必要)

    from selenium import webdriver
    
  • *获取浏览器对象(必要)

    driver = webdriver.Chrome()	#获取谷歌浏览器
    #driver = webdriver.Firefox() #获取火狐浏览器
    #driver = webdriver.Ie() #获取IE浏览器
    
  • *向浏览器发送网址(URL)

    # 向浏览器输入百度的网址
    driver.get("https://www.baidu.com")
    

定位元素

=以下实例都以百度网站为例=

  • id定位
    find_element_by_id()

    # 使用id定位百度搜索框
    driver.find_element_by_id("kw")
    
  • name定位
    find_element_by_name()

    # 使用name定位百度搜索框
    driver.find_element_by_name("wd")
    
  • class定位
    find_element_by_class_name()

    # 使用class定位百度搜索框
    driver.find_element_by_class_name("s_ipt")
    
  • tag定位
    find_element_by_tag_name()

    driver.find_element_by_tag_name("")
    
  • link定位:定位文本链接,使用link通过元素标签对之间的文本信息来定位元素
    find_element_by_link_text()

    # 使用link定位百度搜索框上的百度新闻
    driver.find_element_by_link_text("新闻")
    
  • partial link定位:parial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接。
    find_element_by_partial_link_text()

    # 使用partial link定位百度搜索框上的百度新闻
    driver.find_element_by_partial_link_text("新")
    
  • XPath定位:元素的路径定位
    find_element_by_xpath()

    # 使用XPath定位百度搜索框
    driver.find_element_by_xpath("//*[@id=\"kw\"]")
    
  • CSS定位:可较为灵活的选择控件的任意属性,一般情况定位速度比Xpath快
    find_element_by_css_selector()

    # 使用CSS定位百度搜索框
    driver.find_element_by_css_selector("#kw")
    
    选择器例子描述
    .class.introclass选择器,选择class="intro"的所有元素
    #id#firstnameid选择器,选择id="firstname"的所有元素
    **选择所有元素
    lementp所有<p>元素
    lement>elementdiv>input选择元素为
    元素之后的所有元素
    lement+elementdiv+input选择同一级中紧接在
    元素之后的所有元素
    attribute=value][target=_blank]选择

控制浏览器

  • 控制浏览器窗口大小

    # 设置浏览器宽1920、高1080显示
    driver.set_windows_size(1920,1080)
    
  • 控制浏览器全屏显示

    driver.maximize_window()
    
  • 控制浏览器后退

    driver.back()
    
  • 控制浏览器前进

    driver.forward()
    
  • 模拟浏览器刷新

    driver.refresh()
    
  • 退出并关闭浏览器及相关的驱动程序

    driver.quit()
    

简单元素操作

  • 单击元素
    click()

    # 定位百度搜索框,输入周星驰
    driver.find_element_by_id("kw").send_keys("周星驰")
    # 定位百度一下的搜索按钮并点击
    driver.find_element_by_id("su").click()
    
  • 模拟按键输入
    *send_keys(value)

    # 定位百度搜索框,输入周星驰
    driver.find_element_by_id("kw").send_keys("周星驰")
    
  • 清除文本
    clear()

    # 定位百度搜索框,清除输入框的内容
    driver.find_element_by_id("kw").clear()
    
  • 提交表单,模拟“回车”操作,可以用来提交搜索框的内容、提交按钮
    submit()

    # 定位百度搜索框,输入周星驰
    driver.find_element_by_id("kw").send_keys("周星驰")
    # 提交表单,开始搜索
    driver.find_element_by_id("kw").submit()
    
  • 获取元素的尺寸
    size

    # 获取百度搜索框的尺寸
    print(driver.find_element_by_id("kw").size)
    执行结果:
    {'height': 44, 'width': 548}
    
  • 获取元素的文本文字
    text

    # 获取百度页面底部备案信息的文本
    print(driver.find_element_by_css_selector("#bottom_layer > div > p:nth-child(8) > a").text)
    执行结果:
    京公网安备11000002000001
  • 获取元素任意属性的属性值
    get_attribute(name)

    # 获取百度搜索框type属性和class属性的属性值
    print(driver.find_element_by_id("kw").get_attribute('name'))
    print(driver.find_element_by_id("kw").get_attribute('id'))
    执行结果:
    wd
    kw
    
  • 获取该元素是否可见
    is_displayed()

    # 获取百度搜索框是否可见
    print(driver.find_element_by_id("kw").is_displayed())
    执行结果:
    true
    

鼠标事件

  • 导入提供鼠标操作的ActionChains类
    from selenium.webdriver import ActionChains
    

ActionChains(driver):调用ActionChains类,将浏览器驱动driver作为参数传入。
perform():执行所有ActionChains中存储的行为,可以理解成是对整个操作的提交动作。

  • 鼠标右击
    context_click()方法用于模拟鼠标右键操作,在调用时需要指定元素定位。

    # 定位需要右击的位置
    right_click = driver.find_element_by_id("lg")
    # 对定位的位置进行鼠标右击操作
    ActionChains(driver).context_click(right_click).perform()
    
  • 鼠标悬停
    move_to_element()方法可以模拟鼠标悬停的动作,在调用时需要指定元素定位。

    # 定位到百度上方的“更多”导航栏上
    above = driver.find_element_by_css_selector("#s-top-left > div > a")
    # 在导航栏“更多”上进行鼠标悬浮操作
    ActionChains(driver).move_to_element(above).perform()
    
  • 鼠标双击
    double_click()方法可以模拟鼠标双击的动作,在调用时需要指定元素定位。

    # 定位到百度上方的“更多”导航栏上
    double_click = driver.find_element_by_css_selector("#s-top-left > div > a")
    # 在导航栏“更多”上进行鼠标双击操作,打开两个百度产品大全
    ActionChains(driver).double_click(double_click).perform()
    
  • 鼠标拖放
    drag_and_drop(element, target)在源元素上按住鼠标左键,然后移动到目标元素上释放。

    element = driver.find_element_by_id("xxx")
    target = driver.find_element_by_id("xxx")
    ActionChains(driver).drag_and_drop(element, target).perform()
    

键盘事件

  • 导入提供键盘操作的Keys模块

    from selenium.webdriver.common.keys import Keys
    
  • 删除键(BackSpace)

    send_keys(Keys.BACK_SPACE)
    
  • 空格键(Space)

    send_keys(Keys.SPACE)
    
  • 制表键(Tab)

    send_keys(Keys.TAB)
    
  • 回退键(Esc)

    send_keys(Keys.ESCAPE)
    
  • 回车键(Enter)

    send_keys(Keys.ENTER)
    
  • Shift键

    send_keys(Keys.SHIFT)
    
  • 全选(Ctrl+A)

    send_keys(Keys.CONTROL, 'a')
    
  • 复制(Ctrl+C)

    send_keys(Keys.CONTROL, 'c')
    
  • 剪切(Ctrl+X)

    send_keys(Keys.CONTROL, 'x')
    
  • 粘贴(Ctrl+V)

    send_keys(Keys.CONTROL, 'v')
    
  • 键盘F1

    send_keys(Keys.F1)
    

QQ邮箱登录

  • 程序代码
    from selenium import webdriver
    # from selenium.webdriver import ActionChains
    # from selenium.webdriver.common.keys import Keys
    import time
    
    driver = webdriver.Chrome()
    driver.get("https://mail.qq.com/")
    
    print("==========登录前==========")
    
    # 打印当前页面title
    currentTitle = driver.title
    print(currentTitle)
    
    # 打印当前页面URL
    currentURL = driver.current_url
    print(currentURL)
    
    # 定位login_frame
    driver.switch_to.frame("login_frame")
    
    # 执行QQ邮箱登录
    driver.find_element_by_css_selector("#switcher_plogin").click()
    driver.find_element_by_id("u").clear()
    driver.find_element_by_id("u").send_keys("1572265659")
    driver.find_element_by_id("p").clear()
    driver.find_element_by_id("p").send_keys("QQ密码")
    driver.find_element_by_id("login_button").click()
    time.sleep(5)
    
    print("==========登录后==========")
    
    # 再次打印当前页面title
    print(driver.title)
    
    # 再次打印当前页面URL
    print(driver.current_url)
    
    if driver.title != currentTitle and driver.current_url != currentURL:
        print("==========登录成功==========")
    else:
        print("==========登录失败==========")
    
  • 执行结果
    D:\Python\python.exe E:/Python/Automate/BaiduLogin.py
    ==========登录前==========
    登录QQ邮箱
    https://mail.qq.com/
    ==========登录后==========
    QQ邮箱
    https://mail.qq.com/cgi-bin/frame_html?sid=XeatV4kpGK7GH0Ii&r=a2ece68ab7413801f5498383904acee3
    ==========登录成功==========
    

设置元素等待

WebDriver 提供了两种类型的等待:显式等待和隐式等待。

显式等待

显式等待使 WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛弃超时异常(TimeoutException) 。

  • 导入By类

    from selenium.webdriver.common.by import By
    
  • 导入WebDriverWait类

    from selenium.webdriver.support.ui import WebDriverWait
    
  • 导入expected_conditions类

    from selenium.webdriver.support import expected_conditions as EC
    
  • 显式等待实例

    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
    
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    element = WebDriverWait(driver, 5, 0.5)
    	.until(EC.presence_of_element_located((By.ID, "kw")))
    print(element)
    driver.quit()
    
    WebDriverWait(driver=driver, timeout=5, poll_frequency=0.5, ignored_exceptions=None)
    
    WebDriverWait参数:
    driver:浏览器驱动
    timeout:最长超时时间,默认单位为秒
    poll_frequency:检测的间隔(步长)时间,默认为0.5s
    ignored_exceptions:超时后的异常信息,默认情况下抛 NoSuchElementException异常。
    
    until(method=EC.presence_of_element_located((By.ID, "kw")),message=None)
    
    调用until()方法提供的驱动程序作为一个参数,直到返回值为True
    presence_of_element_located()方法判断元素是否存在。
    
    until_not(method=EC.presence_of_element_located((By.ID, "kw")),message=None)
    
    调用until_not()方法提供的驱动程序作为一个参数,直到返回值为False
    presence_of_element_located()方法判断元素是否存在。
    

隐式等待

隐式等待是通过一定的时长等待页面上某元素加载完成。如果超出了设置的时长元素还没有被加载,则抛出 NoSuchElementException异常。WebDriver 提供了implicitly_wait()方法来实现隐式等待,默认设置为0。

  • 导入NoSuchElementException类
from selenium.common.exceptions import NoSuchElementException
  • 隐式等待实例
from selenium.common.exceptions import NoSuchElementException
from time import ctime

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
try:
    print(ctime())
    driver.find_element_by_id("kw").send_keys("周星驰")
    # driver.find_element_by_id("kw111").send_keys("周星驰")
except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())
    driver.quit()
    

如果代码是driver.find_element_by_id("kw").send_keys("周星驰")
执行结果为:
Sun Apr  4 15:15:33 2021
Sun Apr  4 15:15:33 2021

如果代码是driver.find_element_by_id("kw111").send_keys("周星驰")
执行结果为:
Sun Apr  4 15:17:30 2021
Message: no such element: Unable to locate element: 
{"method":"css selector","selector":"[id="kw111"]"}
  (Session info: chrome=89.0.4389.114)
Sun Apr  4 15:17:40 2021

结论:
如果代码能正常执行,则不影响脚本的执行速度
如果代码不能正常执行,则会等待10秒,抛出异常

expected_conditions类

  • title_is
    判断当前页面的标题是否等于预期

  • title_contains
    判断当前页面的标题是否包含预期字符串

  • presence_of_element_located
    判断元素是否被加在 DOM树里,并不代表该元素一定可见

  • visibilitiy_of_element_located
    判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0)

  • visibilitiy_of
    与上一个方法作用相同,只是上一个方法参数为定位,该方法接收的参数为定位后的元素

  • presence_of_all_elements_located
    判断是否至少有一个元素存在于DOM树中。例如,在个页面中有n个元素的class为“wp”,那么只要有一个存在就返回True

  • text_to_be_present_in_element
    判断某个元素中的 text是否包含了预期的字符串

  • text_to_be_present_in_element_value
    判断某个元素的value属性是否包含了预期的字符串

  • frame_to_be_available_and_switch_to_it
    判断该表单是否可以切换进去、如果可以,返回True并且 switch进去,否则返回False

  • invisibility_of_element_located
    判断某个元素是否不存在于DOM树或不可见

  • element_to_be_clickable
    判断元素是否可见并且是可以点击的

  • staleness_of
    等到一个元素从 DOM树中移除

  • element_to_be_selected
    判断某个元素是否被选中,一般用在下拉列表

  • element_selection_state_to_be
    判断某个元素的选中状态是否符合预期

  • element_located_selection_state_to_be
    与上一个方法作用相同,只是上一个方法参数为定位后的元素,该方法接收的参数为定位

  • alert_is_present
    判断页面上是否存在alert

一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!

整理不易,如果看完觉得有所收获的话,记得一键三连哦,谢谢!

;原文链接:https://blog.csdn.net/weixin_46382560/article/details/115408444
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:python批量管理文献 下一篇:没有了

推荐图文


随机推荐