• Selenium浏览器自动化测试框架


    介绍

      Selenium [1]  是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

    功能
    • 框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。

    • 使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。

    • 使用简单,可使用Java,Python等多种语言编写用例脚本。

    优势

      Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Chrome和 Firefox 中运行。其他测试工具都不能覆盖如此多的平台。使用 Selenium 和在浏览器中运行测试还有很多其他好处。

    下面是主要的两大好处:

    通过编写模仿用户操作的 Selenium 测试脚本,可以从终端用户的角度来测试应用程序。通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。Selenium 的核心,也称browser bot,是用 JavaScript 编写的。这使得测试脚本可以在受支持的浏览器中运行。browser bot 负责执行从测试脚本接收到的命令,测试脚本要么是用 HTML 的表布局编写的,要么是使用一种受支持的编程语言编写的。

    官方文档:7. WebDriver API — Selenium Python Bindings 2 documentation

    chromedriver下载:http://chromedriver.storage.googleapis.com/index.html

    chromedriver与chrome的对应关系表:selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)_python_脚本之家

    基本使用

    安装: pip install selenium

    1. from selenium import webdriver
    2. browser = webdriver.Chrome(executable_path='chromedriver.exe') # 声明一个浏览器对象 指定使用chromedriver.exe路径
    3. browser.get("https://www.baidu.com") # 打开Chrome
    4. input = browser.find_element_by_id("kw") # 通过id定位到input框
    5. input.send_keys("python") # 在输入框内输入python
    6. print(browser.current_url) # 打印url
    7. print(browser.get_cookies()) # 打印Cookies
    8. print(browser.page_source) # 打印网页源代码
    9. browser.close() # 关闭浏览器

    获取单节点

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. browser.get("https://www.taobao.com")
    4. # 找到搜索框
    5. input_id = browser.find_element_by_id("q") # 通过id找
    6. input_name = browser.find_element_by_name("q") # 通过name属性值找
    7. input_css = browser.find_element_by_css_selector("#q") # 根据css选择器找
    8. input_xpath = browser.find_element_by_xpath('//*[@id="q"]') # 根据xpath找
    9. print(input_id,input_name,input_css,input_xpath)
    10. browser.close()
    11. """
    12. 1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
    13. 1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
    14. 1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
    15. 1dfb3c1ac919b0a5ff778cd3bf6db759", element="84b6d58e-04d6-4483-9a3f-f2e116437075")>
    16. """
    17. # 其他获取单个节点方法
    18. """
    19. find_element_by_link_text
    20. find_element_by_partial_link_text
    21. find_element_by_tag_name
    22. find_element_by_class_name
    23. """
    24. # 通过方法
    25. # find_element(By.ID,"q") # 参数为查找方式和值

    获取多节点

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. browser.get("https://www.taobao.com")
    4. lis = browser.find_elements_by_css_selector(".service-bd li") # 注意是elements多个s
    5. print(lis) # 输出为列表
    6. """
    7. [588f61b0d90f7bf199d3f0ede6f9fb99", element="454d656c-1730-410e-891e-210bfdf0d248")>, 588f61b0d90f7bf199d3f0ede6f9fb99", element="119177aa-014a-48c1-8bea-8ca9a50b446e")>, 588f61b0d90f7bf199d3f0ede6f9fb99", element="974860cf-1218-4ddf-a745-85f86090e188")>, 588f61b0d90f7bf199d3f0ede6f9fb99", element="e5877c0c-f4df-4847-9875-1c81d56f21ee")>]
    8. """
    9. # 其他获取多个节点方法
    10. """
    11. find_elements_by_id("q")
    12. find_elements_by_name("q")
    13. find_elements_by_css_selector("#q")
    14. find_elements_by_xpath('//*[@id="q"]')
    15. find_elements_by_link_text
    16. find_elements_by_partial_link_text
    17. find_elements_by_tag_name
    18. find_elements_by_class_name
    19. """
    20. # 通过方法
    21. # find_elements(By.CSS_SELECTOR,".service-bd li") # 参数为查找方式和值

    节点交互

    1. import time
    2. from selenium import webdriver
    3. browser = webdriver.Chrome()
    4. browser.get("https://www.taobao.com")
    5. """
    6. selenium可以驱动浏览器来执行一些动作:
    7. 输入文字用send_keys()
    8. 清空文字用clear()
    9. 点击按钮用click()
    10. """
    11. input = browser.find_element_by_id("q")
    12. input.send_keys("iPhone") #在搜索框输入iPhone
    13. input.clear() # 清空搜索框的文字
    14. time.sleep(2)
    15. input.send_keys("iPad") # 在搜索框输入iPad
    16. button = browser.find_element_by_class_name("btn-search") # 获取点击按钮
    17. button.click() # 点击搜索

    动作链

    1. from selenium import webdriver
    2. from selenium.webdriver import ActionChains # 引入动作链
    3. browser = webdriver.Chrome()
    4. url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
    5. browser.get(url)
    6. browser.switch_to.frame("iframeResult") # 切换到元素所在的frame[框架]
    7. """
    8. 可以传入id、name、index以及selenium的WebElement对象,index从0开始
    9. """
    10. source = browser.find_element_by_css_selector("#draggable") # 找到被拖拽对象
    11. target = browser.find_element_by_css_selector("#droppable") # 找到目标
    12. actions = ActionChains(browser) # 声明actions对象
    13. actions.drag_and_drop(source,target) # 拖拽元素的起点和终点
    14. actions.perform() # 执行动作
    15. action.click_and_hold() # 点击且长按,更多方法查看官方文档

    执行JavaScript代码

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. url = "https://www.zhihu.com/explore"
    4. browser.get(url)
    5. browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") # 将进度条下拉到最底部
    6. browser.execute_script("alert('hello word')") # 弹出alert提示窗

    获取节点信息

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. url = "https://www.zhihu.com/explore"
    4. browser.get(url)
    5. """
    6. WebElement常用属性:
    7. get_attribute 获取属性值
    8. text 获取文本值
    9. id 获取节点id
    10. location 获取节点在页面中的相对位置
    11. tag_name 获取标签名称
    12. size 获取节点大小(宽和高)
    13. """
    14. # 获取属性
    15. logo = browser.find_element_by_id("zh-top-link-logo") # 获取logo节点
    16. print(logo) # 返回值为WebElement对象
    17. logo_class = logo.get_attribute("class") # 获取zh-top-link-logo节点的class属性值
    18. print(logo_class)
    19. # 获取文本值
    20. text_Ele = browser.find_element_by_css_selector(".question_link") # 通过css选择器获取文本内容所在的标签
    21. text = text_Ele.text # 取出标签内的文本内容
    22. print(text)
    23. # 获取ID 位置 标签名和大小
    24. test = browser.find_element_by_class_name("zu-top-add-question")
    25. print(test.id) # 0bfe7ae6-ebd9-499a-8f4e-35ae34776687
    26. print(test.location) # {'x': 759, 'y': 7}
    27. print(test.tag_name) # button
    28. print(test.size) # {'height': 32, 'width': 66}

    切换frame

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
    4. browser.get(url)
    5. """
    6. 网页中有一种节点叫做iframe,也就是子Frame,相当于页面的子页面,
    7. 他的结构和外部网页的结构完全一致。
    8. selenium打开页面后,他默认是在父级Frame里面操作,
    9. 而此时如果页面中还有子Frame,他是不能获取到子Frame里面的节点的,
    10. 这时候就需要使用switch_to.frame()方法来切换Frame。
    11. """
    12. browser.switch_to.frame("iframeResult")
    13. logo = browser.find_elements_by_class_name("logo")
    14. print(logo)
    15. # [<selenium.webdriver.remote.webelement.WebElement (session="1ccb11403013c749ce9fceda50a00975", element="88e5924e-d655-44c3-a905-8af1947b9d86")>]

    延时等待

    1. ---------------------------隐式等待-------------------------
    2. from selenium import webdriver
    3. browser = webdriver.Chrome()
    4. # 隐式等待
    5. browser.implicitly_wait(2) # 设定等待时间
    6. url = "https://www.zhihu.com/explore"
    7. browser.get(url)
    8. input = browser.find_element_by_class_name("aaa")
    9. print(input)
    10. # 报错信息
    11. """
    12. raise exception_class(message, screen, stacktrace)
    13. selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".aaa"}
    14. (Session info: chrome=75.0.3770.142)
    15. """
    16. """
    17. 如果selenium没有在DOM中找到节点,将继续等待,超出设定事件后,则抛出找不到节点的异常。
    18. 当查找节点而节点并没有立即出现的时候,隐式等待将等待一段时间在查找DOM,默认时间是0
    19. """
    20. --------------------------显式等待------------------------
    21. # 显示等待
    22. from selenium import webdriver
    23. from selenium.webdriver.common.by import By
    24. from selenium.webdriver.support.ui import WebDriverWait
    25. from selenium.webdriver.support import expected_conditions as EC
    26. browser = webdriver.Chrome()
    27. browser.get("https://www.taobao.com/")
    28. wait = WebDriverWait(browser,2)
    29. input = wait.until(EC.presence_of_element_located((By.ID,"q")))
    30. button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn-search")))
    31. print(input,button)
    32. # 等待条件
    33. # EC.presence_of_element_located 节点出现
    34. # EC.element_to_be_clickable 可点击
    35. # 更多等待条件查看260页
    36. """
    37. 引入WebDriverWait对象指定最长等待时间,调用它的until方法,
    38. 传入要等待的条件expected_conditions,比如这里传入例如presence_of_element_located
    39. 这个条件,代表节点出现的意思,其参数是节点的定位元组,也就是ID为q的搜索框。
    40. 这样可以做到的效果就是,在10秒内如果ID为q的节点(即搜索框)成功加载出来,就返回该节点,
    41. 如果10秒还没有加载出来,就抛出异常。
    42. """
    43. """
    44. 异常:
    45. TimeoutException
    46. """
    47. """
    48. 指定要查找的节点,然后指定一个最长等待时间,如果在规定时间内加载出来了这个节点,
    49. 就返回查找的节点,如果到了规定时间依然没有加载出该节点,则抛出【超时】异常
    50. """

    前进和后退

    1. import time
    2. from selenium import webdriver
    3. browser = webdriver.Chrome()
    4. browser.get("https://www.baidu.com")
    5. browser.get("https://www.taobao.com")
    6. browser.get("https://www.jd.com")
    7. browser.back() # 后退
    8. time.sleep(2)
    9. browser.forward() # 前进
    10. browser.close() # 关闭浏览器
    11. # 连续访问三个页面

    cookies

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. browser.get("https://www.zhihu.com/explore")
    4. cookies = browser.get_cookies() # 获取cookies
    5. print(cookies)
    6. browser.add_cookie({"name":"name","domain":"www.zhihu.com","vlue":"germey"})
    7. browser.delete_all_cookies() # 删除所有cookies

    选项卡管理

    1. import time
    2. from selenium import webdriver
    3. browser = webdriver.Chrome()
    4. browser.get("https://www.baidu.com")
    5. browser.execute_script("window.open()")
    6. print(browser.window_handles)
    7. # ['CDwindow-7106D94FF002752ADF198B986343E31D', 'CDwindow-B669BA9559DBB78D8D6EC9C5AA699C40']
    8. browser.switch_to.window(browser.window_handles[1])
    9. browser.get("https://www.taobao.com")
    10. time.sleep(1)
    11. browser.switch_to.window(browser.window_handles[0])
    12. browser.get("https://jd.com")
    13. """
    14. 1、打开百度网页
    15. 2、新开一个选项卡,调用execute_script()方法传入JavaScript语法window.open()
    16. 3、切换到新打开的选项卡,调用window_handles属性获取当前开启的所有选项卡,返回的是选项卡的代号列表,
    17. 要想切换选项卡只需要调用switch_to.window()方法,这里我们将第二个选项卡代号传入,
    18. 即跳转到第二个选项卡,在第二个选项卡里打开新页面https://www.taobao.com,然后切换回第一个选项卡打开jd页面
    19. """

    异常处理

    1. from selenium import webdriver
    2. browser = webdriver.Chrome()
    3. browser.get("https://www.baidu.com")
    4. try:
    5. browser.find_element_by_id("hello")
    6. except Exception as e:
    7. print(e) # 打印错误信息 Exception捕获所有错误信息赋给e
    8. finally:
    9. browser.close()
    10. """
    11. 在使用selenium的过程中,难免遇到一些异常,例如超时、节点未找到错误,
    12. 一旦出现此类错误,程序便不会在继续运行了,这里我们使用try except语句来捕获各种异常
    13. """

    选项卡切换

    1. import time
    2. from selenium import webdriver
    3. from selenium.webdriver import ChromeOptions
    4. option = ChromeOptions()
    5. browser = webdriver.Chrome(executable_path='D:\chromedriver.exe',options=option) # 声明一个浏览器对象
    6. option.add_experimental_option('excludeSwitches', ['enable-automation'])
    7. browser.get("https://www.baidu.com") # 打开Chrome
    8. input = browser.find_element_by_id("kw") # 通过id定位到input
    9. input.send_keys("爱奇艺") # 在输入框内输入python
    10. browser.find_element_by_id("su").click()
    11. time.sleep(3)
    12. browser.find_element_by_xpath('//*[@id="1"]/h3').click()
    13. time.sleep(10)
    14. browser.switch_to_window(browser.window_handles[1]) # 切换到新打开的选项卡定位爱奇艺的搜索框
    15. search = browser.find_element_by_xpath("//input[@class='search-box-input']").send_keys("青春有你")
    16. browser.close() # 关闭浏览器

    无头浏览器

    1. from selenium import webdriver
    2. from selenium.webdriver.chrome.options import Options
    3. # 创建chrome参数对象
    4. opt = Options()
    5. # 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数
    6. opt.add_argument('--headless')
    7. # 创建chrome无界面对象
    8. driver = webdriver.Chrome(options=opt)
    9. driver.get("http://www.baidu.com")
    10. print(driver.page_source)

    Python接口自动化测试零基础入门到精通(2023最新版)

  • 相关阅读:
    pytorch使用cuda时遇到了如下问题
    2022年全球市场血管探针总体规模、主要生产商、主要地区、产品和应用细分研究报告
    考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之第一课行列式
    贪心 Leetcode 1005 K次取反后最大化的数组和
    QTableView、QTableWidget通过setColumnWidth改变列宽无效的问题解决
    【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统
    政企解决方案 | 携手一线城市政企,打造可观测性国产化政务平台
    Git常用命令用法
    Physics-infused Machine Learning for Crowd Simulation 论文理解
    VirtualBox下安装CentOS7.9及网络配置
  • 原文地址:https://blog.csdn.net/jj2772367224/article/details/134562488