Web自动化测试进阶

1.Selenium概述

1.什么是框架?

  框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。

 

  框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。

 

  框架,其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。

2.为什么使用框架?

  1)自己从头实现太复杂

  2)使用框架能够更专注于业务逻辑,加快开发速度

  3)框架的使用能够处理更多细节问题

  4)使用人数多,稳定性,扩展性好

3.1Selenium概述

3.Selenium工作原理

  3.webdriver工作原理

 3.1Selenium概述

1.材料:

 

  1)python3.7

  2)Firefox35(大于43)

  3)selenium2框架

  稳定2.48.0    (pip install selenium==2.48.0)

  4)浏览器驱动 

  chrome

  ie

3.2 Selenium IDE 

1.什么是Selenium-IDE?

 

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

1.环境安装

  firefox官网

 3.3 Selenium API基础

1.浏览器驱动对象

 

  1)库的导入

  from selenium import  webdriver

 

  2)创建浏览器对象

 

  driver = webdriver.xxx()

  

  使用dir(driver)查看方法

  3)浏览器尺寸相关操作

 

  maximize_window()  最大化

 

  get_window_size()  获取浏览器尺寸

  set_window_size()  设置浏览器尺寸

 

  3)浏览器位置相关操作

 

  get_window_position()  获取浏览器位置

  set_window_position(x,y设置浏览器位置

 

  :显示器以左上角为(0,0),所有的位置操作都是相对于显示器左上角展开的位移操作,单位是像素。

  4)浏览器的关闭操作

 

  close()  关闭当前标签/窗口

  quit()  关闭所有标签/窗口

  4)页面请求操作

 

  driver.get(url请求某个url对应的响应

  refresh()  刷新页面操作

  back()  回退到之前的页面

  forward()  前进到之后的页面

3.3 Selenium API基础

3.获取断言信息

 

  0)什么是断言?

  断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言

 

  1)获取断言信息的操作

  current_url  获取当前访问页面url

  title  获取当前浏览器标题

  get_screenshot_as_png()           保存图片

  get_screenshot_as_file(file)       直接保存

 

  page_source                网页源码

 

4.元素的定位 

 

  1)元素定位方法的分类(调用方式):

 

  1.直接调用型(推荐方式)

  driver.find_element_by_xxx(value)

 

  2.使用By类型(需要导入By)

  from selenium.webdriver.common.by import By

  driver.find_element(By.xxx,value

4.元素的定位 

 

  2)元素定位方法的分类(按定位方式):

 

 

4.元素的定位 

 

  3)八种定位方式的示例:

 

  1. driver.find_element_by_xpath(value)

 

  2. driver.find_element_by_css_selector(value)

 

  3. driver.find_element_by_id(value)

 

  4. driver.find_element_by_name(value)

5. driver.find_element_by_class_name(value)

 

  6. driver.find_element_by_tag_name(value)

  案例必应搜索

  7. driver.find_element_by_link_text(value)

 

  8. driver.find_element_by_partial_link_text(value)

5. 元素的操作 
• 
•  对元素的相关操作,一般要先获取到元素,再调用相关方法
  element = driver.find_element_by_xxx (value)
• 
  1) 点击和输入
•  点击操作
•  element.click ()
• 
•  清空 / 输入操作 ( 只能操作可以输入文本的元素 )
•  element.clear ()  空输入框
•  element.send_keys (data)  输入数据
3.4 Selenium API 高级
1. 多标签 之间的切换
•  场景 : 有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。
• 
•  1) 获取所有窗口的句柄
  handles = driver . window_handles
•  调用该方法会得到一个列表,在 selenium 运行过程中的每一个窗口都有一个对应的值存放在里面。
  2) 通过窗口的句柄进入的窗口
•  driver.switch_to_window (handles[n])
• 
•  driver.switch_to.window (handles[n])
•  通过窗口句柄激活进入某一窗口
2. 多表单切换
•  在网页中,表单嵌套是很常见的情况,尤其是在登录的场景
•  1) 什么是多表单?
•  实际上就是使用 iframe/frame ,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面
  2) 处理方法
• 
•  直接使用 id 值切换进表单
•  driver.switch_to.frame (value) / driver.switch_to_frame (value)
•  定位到表单元素,再切换进入
  el = driver.find_element_by_xxx (value)
•  driver.switch_to.rame (el)   / driver.switch_to_frame (el)
4. 弹出框操作
• 
•  1) 进入到弹出框中
•  driver.switch_to.alert
  2) 接收警告
  accept()
  3) 解散警告
  dismiss()
  4) 发送文本到警告框
•  send_keys (data)
案例:58跳转
import unittest,time
from selenium import webdriver
class TestDoubleClass(unittest.TestCase):
@classmethod
 def setUpClass(cls) -> None:
      cls.driver=webdriver.Chrome("Chrome/Application/chromedriver.exe")
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(30)
    #58同城
    def test001(self):
        driver=self.driver
        driver.get("https://bj.58.com/")
        # 定位租房元素
        zf = driver.find_element_by_xpath('//*[@id="fcNav"]/em/a[1]').click()
        #断言验证项目路径是否匹配
        self.assertEqual(driver.current_url, "https://bj.58.com/")
        # 切换句柄
        driver.switch_to.window(driver.window_handles[1])
    def test002(self):
        driver=self.driver
        # 定位昌平元素
        driver.find_element_by_xpath('/html/body/div[5]/div[2]/div[2]/dl[1]/dd/a[4]').click()
        xx = driver.find_element_by_xpath('//*[@id="tab-default"]')
        # 定位显示信息   断言验证
        self.assertEqual(xx.text,"昌平出租房")
        # 定位沙河元素
        driver.find_element_by_xpath('/html/body/div[5]/div[2]/div[2]/dl[1]/dd/div/a[15]').click()
        # 定位输入金额
        driver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[1]/input').send_keys(2000)
        driver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[3]/input').send_keys(4000)
        # 选中刷新
        driver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[5]/a').click()
        #定位写字楼
        driver.find_element_by_xpath('/html/body/div[4]/ul/li[6]/a').click()
        # 切换句柄
        driver.switch_to.window(driver.window_handles[2])
    def test003(self):
        driver = self.driver
        #获取到海淀的写字楼
        driver.find_element_by_xpath('//*[@id="filter-area-container"]/div[1]/a[3]').click()
        xx = driver.find_element_by_xpath('/html/body/div[5]/div[6]/a[1]/span')
        # 断言验证
        self.assertEqual(xx.text, "全部房源")
        #定位输入金额
        driver.find_element_by_xpath('/html/body/div[5]/div[3]/dl[2]/dd/span[3]/input[1]').send_keys(20000)
        driver.find_element_by_xpath('/html/body/div[5]/div[3]/dl[2]/dd/span[3]/input[2]').send_keys(80000)
        #刷新
        driver.find_element_by_xpath('/html/body/div[5]/div[3]/dl[2]/dd/span[3]/a/input').click()
        # # 切换句柄
        # driver.switch_to.window(driver.window_handles[3])
    @classmethod
    def tearDownClass(cls) -> None:
        # cls.driver.quit()
        time.sleep(3)
if __name__ == '__main__':
    unittest.main()

8种查找:

from  selenium import  webdriver
import time
from  selenium.webdriver.common.by import  By
#打开浏览器
driver =webdriver.Firefox()
#访问网址
driver.get("http://www.baidu.com")
# #第一种方式元素定位调用id
# srk=driver.find_element_by_id("kw")
srk=driver.find_element(By.ID,"kw")
#第二种方式元素定位调用name
# srk=driver.find_element_by_name("wd")
#第三种方式元素定位调用class_name
# srk=driver.find_element_by_class_name("s_ipt")
#第四种方式元素定位调用 link_text 指定字段查询
# srk=driver.find_element_by_link_text("新闻")
#第五种方式元素定位调用 by_partial_link_text模糊查
# srk=driver.find_element_by_partial_link_text("闻")
#第六种方式元素定位调用 xpath
# srk=driver.find_elements_by_xpath('//*[@id="kw"]')
#第七种方式元素定位调用css
# srk=driver.find_element_by_css_selector(".s_ipt")
#第八种方式元素定位调用tag


# #输入数据
# srk.send_keys("12306")
#设置暂停时间
time.sleep(2)
driver.quit()

麻烦点的跳转

from  selenium import  webdriver
import  time
dirver=webdriver.Chrome("Chrome/Application/chromedriver.exe")
dirver.get("http://bj.58.com")#访问的网站
#定位租房元素
zf=dirver.find_element_by_xpath("/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a")
zf.click()
#切换句柄
dirver.switch_to_window(dirver.window_handles[1])
time.sleep(3)
#定位昌平元素
cp=dirver.find_element_by_xpath("/html/body/div[5]/div[2]/div[2]/dl[1]/dd/a[4]")
cp.click()
#定位沙河
sh=dirver.find_element_by_xpath("/html/body/div[5]/div[2]/div[2]/dl[1]/dd/div/a[15]")
sh.click()
#
jg=dirver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[1]/input')
jg.send_keys(2000)
time.sleep(2)
jgh=dirver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[1]/input')
jg.send_keys(4000)
#刷新
ss=dirver.find_element_by_xpath('//*[@id="secitem-rent"]/dd/span/span[3]/input')
ss.click()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值