• Selenium自动化测试框架


    一.Selenium概述

    1.1 什么是框架? 

    1.     框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的
    2. 结构用于去解决或者处理复杂的问题。
    3.   框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义
    4. 认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
    5. 框架,其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用
    6. 别人搭好的舞台,你来做表演。

    1.2 为什么使用框架?

    1. 1)自己从头实现太复杂
    2. 2)使用框架能够更专注于业务逻辑,加快开发速度
    3. 3)框架的使用能够处理更多细节问题
    4. 4)使用人数多,稳定性,扩展性好

    1.3 Selenium 工作原理

    二.Selenium API基础

    1. 前提操作

    (1)导入库

    from selenium import webdriver

    (2)创建浏览器对象

    1. driver=webdriver.Chrome() #创建浏览器对象 谷歌浏览器
    2. driver.get('https://www.baidu.com/') #访问网址 百度

    2.方法

    我们需要使用dir()来查看方法

    print(dir(driver)) 

     (1) 调整浏览器的尺寸

    1. driver.maximize_window() #窗口最大化
    2. print(driver.get_window_size()) #获取浏览器尺寸 {'height': 1020, 'width': 945}
    3. driver.set_window_size(width='1200',height='1000') #设置浏览器尺寸

    (2) 调整浏览器的位置

    1. print(driver.get_window_position()) #获取浏览器位置 {'x': 10, 'y': 10}
    2. print(driver.set_window_position(100,100)) #设置浏览器位置

    (3) 获取当前页面的url 

    print(driver.current_url)   #https://www.baidu.com/

    (4) 获取当前页面的title

    print(driver.title)   #百度一下,你就知道

    (5) 刷新页面

    driver.refresh()

    (6) 返回上一页/下一页

    1. driver.back() #上一页
    2. driver.forward() #下一页

    (7) 保存图片

    1. # 方式一:
    2. data=driver.get_screenshot_as_png()
    3. with open('111.jpg','wb') as f:
    4. f.write(data)
    5. # 方式二:
    6. driver.get_screenshot_as_file('222.jpg')

    (8) 查看网页源码

    print(driver.page_source)

     (9) 关闭网页

    1. driver.close() #关闭当前页面
    2. driver.quit() #关闭所有页面

    3. 元素定位

    1. # 方式一: driver.find_element_by_xxx(value)
    2. # 方式二:driver.find_element(By.xxx,value)
    3. # 1.id
    4. input=driver.find_element_by_id('kw')
    5. input.send_keys(12306)
    6. # 2.class
    7. input=driver.find_element_by_class_name('s_ipt')
    8. input.send_keys(12306)
    9. # 3.name
    10. input=driver.find_element_by_name('wd')
    11. input.send_keys(12306)
    12. # 4.xpath
    13. input=driver.find_element_by_xpath('//*[@id="kw"]')
    14. input.send_keys(12306)
    15. # 5.css
    16. input=driver.find_element_by_css_selector('#kw')
    17. input.send_keys(12306)
    18. # 6.link_text 全匹配
    19. news=driver.find_element_by_link_text('新闻')
    20. news.click()
    21. # 7.partial_link_text 模糊匹配
    22. news=driver.find_element_by_partial_link_text('闻')
    23. news.click()
    24. # 8.tag name 标签名
    25. put=driver.find_element_by_tag_name("span")
    26. put.click()

    三.Selenium API高级

    3.1 页面跳转

    1. from selenium import webdriver
    2. driver=webdriver.Chrome()
    3. driver.get('http://bj.58.com')
    4. # 获取当前页面的句柄
    5. h1=driver.window_handles
    6. print('58同城:',h1)
    7. # 定位元素 宠物
    8. a=driver.find_element_by_link_text('宠物')
    9. # 点击宠物
    10. a.click()
    11. # 获取点击跳转之后的句柄
    12. h2=driver.window_handles
    13. print('宠物:',h2)
    14. # 跳转句柄
    15. driver.switch_to.window(h2[1])
    16. # 定位元素 宠物狗
    17. dog=driver.find_element_by_xpath('/html/body/div[3]/div[1]/dl[1]/dd[1]/a/strong')
    18. # dog=driver.find_element_by_link_text('宠物狗')
    19. dog.click()
    20. # 获取点击跳转之后的句柄
    21. h3=driver.window_handles
    22. print('宠物狗:',h3)
    23. # 跳转句柄
    24. driver.switch_to.window(h3[2])
    25. # 定位元素
    26. small=driver.find_element_by_css_selector('#selection > dl:nth-child(1) > dd > a:nth-child(6)')
    27. small.click()

    3.2 表单跳转

    1. from selenium import webdriver
    2. import time
    3. driver=webdriver.Chrome()
    4. driver.get('https://qzone.qq.com/') #访问qq空间页面
    5. driver.maximize_window() #窗口最大化
    6. #定位表单
    7. frame=driver.find_element_by_id('login_frame')
    8. # 表单跳转
    9. driver.switch_to.frame(frame)
    10. time.sleep(2)
    11. # 点击密码登录
    12. driver.find_element_by_link_text('密码登录').click()
    13. time.sleep(2)
    14. # 输入账号
    15. driver.find_element_by_id('u').send_keys('1720003909')
    16. time.sleep(2)
    17. # 输入密码
    18. driver.find_element_by_id('p').send_keys('xqy20001220')
    19. time.sleep(2)
    20. # 点击登录
    21. driver.find_element_by_id('login_button').click()
    22. # 关闭页面
    23. driver.close()

    3.3 弹出框操作

    1. #进入弹出框
    2. driver.switch_to.alert
    3. #接收警告
    4. accept()
    5. #解散警告
    6. dismiss()
    7. #发送文本到警告框
    8. send_keys(data)

    代码:

    1. from selenium import webdriver
    2. import time
    3. driver=webdriver.Chrome()
    4. driver.get('https://www.baidu.com/')
    5. # 定位 设置
    6. set=driver.find_element_by_id('s-usersetting-top')
    7. set.click()
    8. # 定位 搜索设置
    9. search=driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]/span')
    10. search.click()
    11. # 定位 每页20条
    12. page=driver.find_element_by_xpath('/html/body/div[1]/div[6]/div/div/div/div[1]/form/div/ul/li[3]/span[2]/span[2]/label')
    13. page.click()
    14. # 定位 保存设置
    15. save=driver.find_element_by_css_selector('#se-setting-7 > a.prefpanelgo.setting-btn.c-btn.c-btn-primary')
    16. save.click()
    17. time.sleep(2)
    18. driver.switch_to.alert.accept() #弹框处理
    19. # driver.switch_to.alert.dissmiss() #弹框处理

    3.4 滚动条操作

    1. from selenium import webdriver
    2. import time
    3. driver=webdriver.Chrome()
    4. driver.get('http://bj.58.com')
    5. time.sleep(3)
    6. # 滚动条到底部
    7. # js="var q=document.documentElement.scrollTop=10000"
    8. js = "window.scrollTo(0,document.body.scrollHeight)"
    9. driver.execute_script(js) #执行js
    10. time.sleep(3)
    11. # 顶部
    12. js="window.scrollTo(0,0)"
    13. driver.execute_script(js)
    14. time.sleep(3)
    15. # 移动到指定元素
    16. target = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[2]/div[2]/a[13]') #定位移动到的元素
    17. driver.execute_script("arguments[0].scrollIntoView();", target)
    18. target.click()

    3.5 鼠标键盘操作

    1. from selenium import webdriver
    2. from selenium.webdriver import ActionChains #鼠标操作
    3. from selenium.webdriver.common.keys import Keys #键盘操作
    4. import time
    5. driver=webdriver.Chrome()
    6. driver.get('https://www.baidu.com/')
    7. # 定位元素 更多
    8. more=driver.find_element_by_link_text('更多')
    9. #鼠标操作
    10. ActionChains(driver).click(more).perform() #鼠标左击
    11. ActionChains(driver).context_click(more).perform() #鼠标右击
    12. ActionChains(driver).move_to_element(more).perform() #鼠标悬浮
    13. #键盘操作
    14. srk = driver.find_element_by_id("kw")
    15. srk.send_keys(12306)
    16. time.sleep(2)
    17. srk.send_keys(Keys.CONTROL,"a")
    18. srk.send_keys(Keys.CONTROL,"x")
    19. time.sleep(2)
    20. srk.send_keys(Keys.CONTROL,'v')

    3.6 下拉框操作

    1. from selenium import webdriver
    2. driver=webdriver.Chrome()
    3. driver.get('https://www.baidu.com/')
    4. driver.maximize_window()
    5. # 定位元素 设置按钮
    6. set=driver.find_element_by_id('s-usersetting-top')
    7. set.click()
    8. # 定位元素 高级搜索
    9. find=driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[2]/span')
    10. find.click()
    11. # 定位元素 全部时间
    12. time=driver.find_element_by_class_name('c-select-selected-value')
    13. time.click()
    14. # 定位元素 最近一月
    15. m=driver.find_elements_by_class_name('c-select-item')
    16. #方式一:
    17. m[3].click()
    18. #方式二
    19. for i in m:
    20. if i=='最近一月':
    21. i.click()

    3.7 等待操作

    (1)强制等待

    1. import time #强制等待:无论网络是否良好,必须等待对应的时间,才会执行下面的代码
    2. time.sleep(3)

    (2) 隐式等待

    driver.implicitly_wait(100)  #隐式等待,当前界面的所有元素全部加载完成,才会执行下面的代码

    (3) 显示等待

    1. from selenium.webdriver.support.wait import WebDriverWait #导入显性等待的包
    2. from selenium.webdriver.support import expected_conditions as EC #判断所需要的元素是否已经被加载出来
    3. from selenium.webdriver.common.by import By #定位
    4. # 定位元素 设置按钮
    5. WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,"s-usersetting-top")))
    6. set=driver.find_element_by_id('s-usersetting-top')
    7. set.click()

    四.Selenium IDE

    4.1 什么是Selenium IDE?

    1. Selenium的IDE(集成开发环境)是一个易于使用的Firefox插件,用于开发Selenium测试案例。
    2. 它提供了一个图形用户界面,用于记录使用Firefox浏览器,用来学习和使用Selenium用户操作,
    3. 但它只能用于只用Firefox浏览器不支持其它浏览器

    4.2 IDE功能简介

  • 相关阅读:
    web前端期末大作业:旅游网页设计与实现——个人旅游博客(4页)HTML+CSS
    linux编写shell脚本实现判断当端口被占用时杀死进程
    存内计算技术在边缘计算、物联网设备中的应用及前景
    Laravel笔记-自定义登录中新增登录5次失败锁账户功能(提高系统安全性)
    教你遇到vcomp120.dll无法继续执行代码的解决方法
    你想过如何让自己变得更好吗?-关于个人成长的思考二
    高并发、多线程、分布式都不懂,你拿什么跳槽阿里、腾讯、京东?还不好好学习啊
    FFplay文档解读-29-视频过滤器四
    [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
    ArcGIS直连PostgreSQL(Windows篇)
  • 原文地址:https://blog.csdn.net/qq_44954371/article/details/126611927