Selenium-webdriver—使用Page Object设计模式

频次最高的38道selenium面试题及答案(上) 1、selenium的原理是什么? selenium的原理涉及到3个部分,分别是: 浏览器 driver:一般我们都会下载driver client:也就是我们写的代码 client其实并不知道浏览器是怎么工作的,但是driver知道,在selenium启动以后,driver其实充当了服务器的角色,跟client和浏览器通信,client根据webdriver协议发送请求给driver,driver解析请求,并在浏览器上执行相应的操作,并把执行结果返回给client。这就是seleniu... 阅读详情
在进行web前端自动化测试的过程中,Page Object设计模式可以称得上是杀人放火,居家旅行的常备武器。

Page Object将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。举例来说,在没有使用Page Object模式的情况下,脚本可能是这样写的:

Ruby代码  收藏代码
  1. require 'rubygems'  
  2. require 'selenium-webdriver'  
  3.   
  4. url = 'www.soso.com'  
  5. dr = Selenium::WebDriver.for :ie  
  6. dr.navigate.to url  
  7.   
  8. ua_links = dr.find_element(:id => 'ua').find_elements(:css => 'a')  
  9. ua_links[3].click  
  10. ua_links[3].send_keys(:enter)  
  11. sleep 2  
  12. dr.switch_to.frame('login_frame')  
  13. user = {:name => 'test', :psd => 'test'}  
  14. dr.find_element(:id => 'u').send_keys(user[:name])  
  15. dr.find_element(:id => 'p').send_keys(user[:psd])  
  16. dr.find_element(:id => 'login_button').click  
  17. sleep 2  
  18. dr.close  

这段脚本的作用是去到soso,然后点击【登陆】link,待登陆的dialog弹出后输入用户名和密码,点击【登陆】按钮进行登陆。

看上去这段脚本是不错的,因为其很好的完成了登陆的任务,但不妨深入思考一下,如果我们需要验证错误的用户名正确的密码的话,那么上面关于登陆的那几行脚本是不是需要重复写一遍?

答案是否定的,因为登陆的功能可以抽象成函数,如下所示:

Ruby代码  收藏代码
  1. def login usr, psd  
  2.     dr.find_element(:id => 'u').send_keys(usr)  
  3.     dr.find_element(:id => 'p').send_keys(psd)  
  4.     dr.find_element(:id => 'login_button').click  
  5. end  

这样就可以通过构造不同的数据,每次测试时只需要调用login函数就可以了。

再深入想一下,假设需要测试不输入用户名和密码直接点击登陆按钮的情况,那该怎么办呢?

首先最容易想到的一点是改造login函数,当然usr和psd没有传入的时候就直接点点击登陆按钮,这是没有问题的。不过如果本着代码增强可读性原则,亦可以定义一个名为login_without_usr_psd的函数,如下所示

Ruby代码  收藏代码
  1. def login_without_usr_psd  
  2.     dr.find_element(:id => 'login_button').click  
  3. end  

这样在编写测试用例代码的时候就可以直接凭借函数名来揣测出该函数的作用,起到了self explain的作用。在自动化测试代码中,这一点是被鼓励的。

不过这样多定义1个函数就会带来另外的问题 dr.findelement(:id => ‘loginbutton’).click这行代码就在loin函数和login_without_usr_psd中重复使用。

为了解决这个有些丑陋的问题,使得代码能够稍微美化一点,可以定义另外一个函数来实现点击登陆按钮的功能。

Ruby代码  收藏代码
  1. def click_login_btn  
  2.     dr.find_element(:id => 'login_button').click  
  3. end  
  4.   
  5. # now login_without_usr_psd will like below  
  6. def login_without_usr_psd  
  7.     click_login_btn  
  8. end  
  9.   
  10. # login function will like this  
  11. def login usr, psd  
  12.     dr.find_element(:id => 'u').send_keys(usr)  
  13.     dr.find_element(:id => 'p').send_keys(psd)  
  14.     click_login_btn  
  15. end  

好了,那么本着使代码更加灵活,self explain 特性更加明显的原则,我们又可以将输入用户名,输入用户密码功能抽象成函数,这时候login函数看起来可能会是这样的:

Ruby代码  收藏代码
  1. def login usr, psd  
  2.     set_usr usr  
  3.     set_psd psd  
  4.     click_login_btn  
  5. end  

如果我们重复上面的步骤,一步一步的提升代码的复用性和可读性的话,我们就会发现除了上面演示的setusr,setpsd这样的【基本动作】外,有些测试对象也是可以复用的。比如在登陆的时候我们会用到密码输入框,也许在修改密码的时候我们也会用到这一对象。

很自然的就会想到,如果将一些测试对象以及操作这些测试对象的动作或步骤封装在1个类中,那么代码的灵活性和适用性将会更强。那么按照什么纬度来划分这些类呢?也是很自然的,就像睡醒了就会睁眼,挖完煤就要洗脸一样,我们会发现按照页面也就是page来组织这些类将是很好的解决方案。

这就是Page Object设计模式,将每一个测试页面抽象为1个Page类,并在该类中封装了本页面的测试对象和基本的测试步骤,以提高代码的可读性复用性通用性和一致性。Page Object设计模式带来的好处是显而易见的。比如使用了page object模式后,测试用例可能会如下面所示

Ruby代码  收藏代码
  1. soso_page = Site.new(dr).soso_main_page(url).open  
  2. soso_page.login wrong_usr, wrong_psd  
  3. soso_page.error_msg.should be_eql('error')  

测试用例简单且易读,而且代码的复用性极佳。其他用例需要使用到login功能时候只需要new 包含该功能的Page对象,调用login方法既可。

下面的代码演示了如何使用Page Object设计模式重构本文开头所实现的soso主页用户登陆功能。

Ruby代码  收藏代码
  1. base_page.rb  
  2.   
  3. class BrowserContainer  
  4.     def initialize driver  
  5.         @dr = driver  
  6.     end  
  7. end # BrowserContainer  
  8.   
  9. class Site < BrowserContainer  
  10.     def soso_main_page url  
  11.         @soso_main_page = SosoMainPage.new(@dr, url)  
  12.     end  
  13.   
  14.     def close  
  15.         @dr.close  
  16.     end  
  17. end #Site  
  18.   
  19. class BasePage < BrowserContainer  
  20.     attr_reader :url  
  21.   
  22.     def initialize dr, url  
  23.         super(dr)  
  24.         @url = url  
  25.     end  
  26.   
  27.     def open  
  28.         @dr.navigate.to @url  
  29.         self  
  30.     end  
  31. end #BasePage  
  32.   
  33. class SosoMainPage < BasePage  
  34.     require './login_dialog'  
  35.     include LoginDialog  
  36.   
  37.     def login usr, psd  
  38.         open_login_dialog  
  39.         to_dialog_frame  
  40.         usr_field.send_keys usr  
  41.         psd_field.send_keys psd  
  42.         login_btn.click  
  43.     end  
  44.   
  45.     def open_login_dialog  
  46.         login_link.click  
  47.         login_link.send_keys(:enter)  
  48.         sleep 2  
  49.     end  
  50.   
  51.     private  
  52.   
  53.     def ua_links  
  54.         @dr.find_element(:id => 'ua').find_elements(:css => 'a')  
  55.     end  
  56.   
  57.     def login_link  
  58.         ua_links[3]  
  59.     end  
  60. end #SosoMainPage  
  61.   
  62. login_dialog.rb       
  63.   
  64. module LoginDialog  
  65.     def to_dialog_frame  
  66.         begin  
  67.             @dr.switch_to.frame('login_frame')  
  68.         rescue  
  69.             raise 'Can not switch to login dialog, make sure the dialog was open'  
  70.             exit  
  71.         end  
  72.     end  
  73.   
  74.     def usr_field  
  75.         @dr.find_element(:id => 'u')  
  76.     end  
  77.   
  78.     def psd_field  
  79.         @dr.find_element(:id => 'p')  
  80.     end  
  81.   
  82.     def login_btn  
  83.         @dr.find_element(:id => 'login_button')  
  84.     end  
  85. end #LoginDialog  
  86.   
  87. login.rb  
  88.   
  89. require 'rubygems'  
  90. require 'selenium-webdriver'  
  91. require './base_page'  
  92.   
  93. dr = Selenium::WebDriver.for :firefox  
  94. url = 'http://www.soso.com'  
  95. soso_page = Site.new(dr).soso_main_page(url).open  
  96. soso_page.login 'test', 'test'  

上面的代码由3个文件组成。

base_page.rb文件中定义了

  • Site类 主要用于管理测试中所需要用到的各种页面,提供生成这些页面对象的快捷方法。比如Site.new(dr).soso_main_page(url)方法就实例化了1个SosoMainPage对象。
  • BasePage类 所有Page对象的基类
  • SosoMainPage类 代表了soso主页的Page Object类,封装了首页的一些测试对象,原子操作及基本步骤,如login

login_dialog.rb文件中定义了代码登陆弹出框的LoginDialog。由于login dialog可能会出现在多个页面,比如qq音乐的登陆页面也有该弹出框,所以将其抽象成module,需要用到的页面直接include该module既可。

login.rb文件调用page object并实现了具体的测试逻辑,这个文件中可以使用你熟悉的测试框架来组织用例,如unit test和rspec等

关于Page Object设计模式的介绍就要告一段落了,从上面的代码中我们可以感觉到,Page Object模式加上测试用例框架就基本上可以等于简单的自动化测试框架了。所以在构建自动化测试框架的过程中,活用Page Object将为我们带来一系列的实惠和惊喜,就像超级的代金券一样,看上去不起眼但用起来却其乐无穷,浑身舒爽。
Selenium WebDriver——必会知识 在介绍之前先来说一下HTML、Selenium、WebDriver的关系HTML(超文本标记语言):它是一个网页的骨架,通过各种标签和属性(id、class)定义了页面的元素DOM(模型):当浏览器解析HTML后会在内存中对HTML结构生成一个DOM树。如图所示:Selenium:是一个自动化工具/API,通过它来抓取到DOM模型上的元素。 阅读详情

相关推荐

Selenium使用PageObject模式测试登陆页面

Selenium使用PageObject模式测试登陆页面,列出了一些测试用户,主要实现的登陆页面的自动测试

Selenium-webdriver系列教程(8)————使用Page Object设计模式

在进行web前端自动化测试的过程中,Page Object设计模式可以称得上是杀人放火,居家旅行的常备武器。 Page Object将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。举例来说,在没有使用Page Object模式的情况下,脚本可能是这样写的: require 'rubygems' require 'selenium-webdriver' url

2930

STM32 ADC+DMA实战:手把手教你驱动XGZP6847A压力传感器(附完整代码)

本文详细介绍了如何使用STM32的ADC和DMA外设驱动XGZP6847A压力传感器,包括硬件连接、ADC配置、DMA高效传输实现以及数据处理与校准方法。通过实战案例和完整代码,帮助开发者快速掌握高精度压力数据采集技术,适用于工业控制和医疗设备等领域。

weixin_42570484的博客 404

Selenium+Python :WebDriver设计模式( Page Object )

Page Object 设计原理 Page Object设计模式是Selenium自动化测试项目的最佳设计模式之一,强调测试、逻辑、数据和驱动相互分离。 Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧...

axg81207的博客 337

从零开始:使用Python实现基于深度强化学习的柔性车间调度系统

本文详细介绍了如何使用Python和深度强化学习(DRL)构建柔性车间调度系统,特别关注图神经网络(GNN)与近端策略优化(PPO)算法的结合应用。通过实战指南,读者将学习从环境准备、异构图构建到PPO算法实现的全流程,最终实现生产效率的显著提升。

weixin_29074295的博客 244

立创开源Link Hub多功能USB扩展坞:CH339F主控+4层板设计,实测网口/存储性能

本文深度评测了立创开源Link Hub多功能USB扩展坞,其采用CH339F主控芯片与4层PCB板设计,并严格进行阻抗匹配。实测表明,该扩展坞的USB接口与microSD读卡器性能均接近USB 2.0理论极限,百兆以太网口转换效率高,性能损失极小。设计上注重电源保护与信号完整性,是一个兼顾稳定性与成本的高完成度开源硬件项目。

weixin_36173034的博客 159

selenium webdriver PageElementUtil

public class PageElementUtil { public int TimeoutValue = 30; public PageElementUtil(WebDriver driver) {     PageFactory.initElements(new AjaxElementLocatorFactory(driver, TimeoutValue), this); } @Find...

iSelenium 448

智能车实战——极速越野组GPS与惯导融合定位导航全解析

本文深入解析了智能车极速越野组中GPS与惯导模块的融合定位导航技术。通过对比GPS的全局定位与惯导的高频姿态感知,详细阐述了如何利用MM32SPN27主控,将两者数据融合以实现精准、实时的车辆控制。内容涵盖硬件选型、软件数据处理、PID控制及系统调试等实战环节,为智能车开发者提供了一套完整的解决方案。

pz8901234的博客 1204

终极指南:Tailslayer多通道DRAM数据复制技术原理与实现

Tailslayer是一款革命性的C++库,专为降低DRAM读取时因刷新延迟导致的尾延迟问题而设计。通过创新的多通道DRAM数据复制技术,Tailslayer能够显著提升系统性能,为开发者提供更高效、更可靠的内存访问解决方案。 ## 什么是尾延迟?为何它如此重要? 在计算机系统中,尾延迟(Tail Latency)指的是系统响应时间分布中的极端值,通常是指99.9%或更高百分位的响应时间。对于

gitblog_00385的博客 585

压缩包密码破解工具ZIP Cracker2.0.1.2 正式版

一款多功能文件密码破解工具,支持ZIP、RAR、Office等主流加密格式,提供CPU/GPU双模式破解。该软件采用黑客风格界面,具备环境自检修复功能,支持实时监控硬件使用率。内置hashcat等专业破解工具,通过拖拽文件即可快速破解,GPU模式速度可达CPU的10-100倍。最新版本优化了中文路径支持,并提升了启动速度。

bfq05234214的博客 482

yolov8涨点系列之轻量化主干网络替换

yolov8涨点系列之轻量化主干网络替换,以EfficientVit为例

zhang1379的博客 2887

Selenium自动化测试与数据采集实战:从WebDriver原理到Page Object设计模式

Web自动化测试是软件工程中提升效率、保障质量的关键技术,其核心原理是通过程序模拟用户操作浏览器,实现测试与数据采集的自动化。Selenium作为该领域的经典工具,通过WebDriver协议架起脚本与浏览器间的桥梁,支持多语言与主流浏览器,在回归测试、数据抓取及日常任务自动化等场景中具有重要技术价值。本文聚焦Selenium的实战应用,深入解析元素定位、显式等待等核心机制,并探讨如何通过Page Object设计模式构建可维护的自动化框架,同时涵盖常见问题排查与Playwright的对比选型,为Web自动化

weixin_28718769的博客 289

「UG/NX」BlockUI 树列表(回调函数)

官方对树控件提供了21种回调函数,树的一些操作可以在这些回调函数中进行操作。

何曾参静谧的博客 1330

Selenium-webdriver系列教程(8)———使用Page Object设计模式

有时间再看, 有的地方代码是有问题的。 在进行web前端自动化测试的过程中,Page Object设计模式可以称得上是杀人放火,居家旅行的常备武器。 Page Object将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。举例来说,在没有使用Page Object模式的情况下,脚本可能是这样写的: ? 1 2 3 4

ShanDong_Chu 2008

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Selenium自动化测试:从核心原理到Page Object Model实战

自动化测试是软件工程中提升回归测试效率、确保软件质量的关键实践,其核心原理在于通过脚本模拟用户操作,实现重复性任务的自动化执行。在Web自动化测试领域,Selenium凭借其基于W3C WebDriver协议的真实浏览器操控能力,成为行业标准工具。它通过浏览器驱动与多种编程语言的无缝集成,提供了跨浏览器、跨平台的测试解决方案,技术价值在于保障了测试结果的真实性与可靠性。在应用场景上,Selenium与持续集成/持续部署(CI/CD)流程深度结合,成为敏捷开发中不可或缺的质量门禁。本文聚焦于Selenium

weixin_33603377的博客 260

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Web自动化】Selenium使用及自动化环境搭建

是一个模拟控制浏览器操作的自动化库,它可以做到元素定位,鼠标事件,浏览器事件,js脚本执行等操作。webdriverXPath,全称为XML Path Language,即XML 路径语言,它是一门在XML文档中查找信息的语言。XPath 最初设计是用来搜寻XML文档的,但是它同样适用于 HTML 文档的搜索。2)、Xpath示例:3)、利用Chrome浏览器的开发者工具,可以快速获取XPath表达式。

2301_78276982的博客 1066

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

以后再有人问你selenium是什么,你就把这篇文章给他

写在最前面:目前自动化测试并不属于新鲜的事物,或者说自动化测试的各种方法论已经层出不穷,但是,能够在项目中持之以恒的实践自动化测试的团队,却依旧不是非常多。有的团队知道怎么做,做的还不够好;有的团队还正在探索和摸索怎么做,甚至还有一些多方面的技术上和非技术上的旧系统需要重构…… 本文将会...

286

Selenium2:底层实现+元素8大定位

PO(page object)设计模式是在自动化中已经流行起来的一种易于维护和减少代码的设计模式. 在自动化测试中, PO对象作为一个与页面交互的接口. 测试中需要与页面的UI进行交互时, 便调用PO的方法. 这样做的好处是, 如果页面的UI发生了更改,那么测试用例本身不需要更改, 只需更改PO中的代码即可.解决方法://span[text()= ' 搬砖']/parent::div/parent::a/following-sibling::div[1]//a[text()='抢投标']

weixin_48029567的博客 826

5分钟跑通Kimi-K3:一条克隆命令到2.8万亿参数模型的首次推理

Kimi-K3 是 MoonshotAI 开源的原生多模态大模型,100万 token 上下文,支持文本与图片混合推理。下面用三条命令让你从本地零配置跑到拿到第一个推理结果。 ## 30秒跑起来 ⚡ 只想看效果的话,打开终端,依次敲这三行: ``` git clone https://gitcode.com/MoonshotAI/Kimi-K3 ``` ``` pip install -r

gitblog_00563的博客 471

web python selenium自动化面试题_自动化面试selenium 面试题及答案

1、selenium中如何判断元素是否存在?- isElementPresent2、selenium中hidden或者是display = none的元素是否可以定位到?- 不能3、selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?- 添加元素智能等待时间 driver.implicitly_wait(30)- try 方式进行id,name,clas,x...

weixin_39883440的博客 741

Selenium WebDriver与Java:Web自动化测试全攻略

本文系统介绍了Selenium自动化测试框架的应用实践。主要内容包括:环境搭建(JDK11+、Maven配置、浏览器驱动管理);核心组件解析(WebDriver、WebElement、定位策略等);企业级测试框架设计(分层架构、PageObject模式);最佳实践(智能等待、动态元素处理等);以及持续集成和前沿技术(Selenium Grid4、Docker容器化)。文章提供了从基础配置到高级应用的完整技术路线,帮助测试人员构建高效可靠的自动化测试体系。

2501_94480392的博客 458
上一篇: linux --Vi编辑器
下一篇: 敏捷测试要领分享
liubofengpython
博客等级 码龄15年 23粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值