51Testing软件测试论坛

标题: 掌握基于 Selenium 的 APP 网页端测试秘籍 [打印本页]

作者: 梦幻小丑灯    时间: 2024-7-24 16:04
标题: 掌握基于 Selenium 的 APP 网页端测试秘籍
一、测试环境搭建
首先,我们来讲解如何安装和配置 Selenium 所需的环境。


(一)浏览器驱动程序安装
对于 Chrome 浏览器,您可以通过以下步骤安装驱动程序:
查看浏览器版本。在 Chrome 浏览器中,输入chrome://settings/help可查看版本信息。
访问http://chromedriver.storage.googleapis.com/index.html,根据浏览器版本下载对应驱动。
Windows 操作系统:
解压驱动包,将chromedriver.exe放在谷歌浏览器安装目录下的Application目录,或在系统环境变量的path中添加chromedriver.exe的路径。
也可将chromedriver.exe放在C盘中windows文件夹下的SysWOW64(32 位系统则放在System32中),或D:\\soft\\python3\\Scripts。
Mac 操作系统:将解压得到的chromedriver复制到/usr/local/bin目录下。
Firefox 浏览器则需要安装geckodriver驱动,可从相关网站下载并按照说明进行配置。


(二)Selenium 相关库安装
可以通过以下两种方式安装 Selenium 库:
命令行安装:使用pip install selenium命令,若下载速度慢,可更换镜像源,如pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
也可从官方网站下载安装包,手动进行安装。


(三)环境配置注意事项
不同的操作系统在配置环境时可能会遇到各种问题,需要耐心处理。例如,浏览器版本与驱动版本不匹配可能导致运行错误,要确保两者对应。同时,配置环境变量时要仔细操作,以免出现错误。在安装和配置过程中,若遇到问题,可参考相关文档或在技术社区寻求帮助。

二、元素定位技巧

(一)ID 定位
ID 定位是通过元素的唯一标识符进行定位。在 HTML 中,ID 通常是唯一的,这使得 ID 定位成为一种快速且准确的方式。例如,在百度搜索框的 HTML 代码中,如果其 ID 为 kw ,则可以使用 driver.find_element_by_id("kw") 来定位该元素。


(二)Name 定位
Name 定位是通过元素的名称属性来定位。然而,Name 属性在页面中不一定是唯一的,可能会存在多个元素具有相同的 Name 值。比如豆瓣网的搜索框,其 Name 为 q ,可以通过 driver.find_element_by_name("q") 尝试定位,但要注意可能出现的定位不唯一性问题。


(三)XPath 定位
XPath 定位是一种强大且灵活的定位方式,它可以通过元素的层级关系、属性、文本内容等来进行定位。例如,要定位一个具有特定属性值的元素,可以使用 //input[@id='name'] 这样的表达式。再比如,要定位父元素下的特定子元素,可以使用类似 //div[@id='parent']/input 的表达式。
XPath 定位虽然功能强大,但由于需要遍历整个 DOM 结构,可能会影响性能。因此,在其他定位方式可行的情况下,应优先考虑其他更高效的定位方法。但对于复杂的页面结构或其他定位方式无法准确找到元素的情况,XPath 定位是一个有力的补充。


三、等待策略

(一)强制等待
强制等待通过time.sleep()实现,它会让程序线程固定休眠一段时间。这种方式简单直接,但灵活性较差。
适用场景:
不同系统交互的地方,例如文件上传、与外部系统的通信等。
某些特定的、难以通过其他等待方式准确控制的操作。
(二)隐性等待
隐性等待通过driver.implicitly_wait()设置,它为全局等待,在规定时间内等待页面元素加载完成。
适用场景:
页面整体加载,当希望在一定时间内确保大部分或整个页面的元素加载就绪。
操作流程较为固定,不需要精确等待某个特定元素的情况。
(三)显性等待
显性等待使用WebDriverWait类,通过设置条件和时间上限来等待特定元素满足条件。
适用场景:
操作引起页面变化,需要等待新出现或特定状态的元素。
元素的可见性、可点击性等特定条件需要被精确控制时。
页面中某些元素加载时间不确定或较长,需要单独设置等待条件。
总之,在实际的 Selenium 测试中,应根据具体的页面情况和操作需求,灵活选择和组合使用这三种等待方式,以提高测试的稳定性和效率。


四、模拟用户交互

(一)输入操作
使用 Selenium 模拟用户输入操作可以通过 send_keys() 方法实现。例如,要在输入框中输入文本,可以先定位到输入框元素,然后使用以下代码:
  1. <font size="3">from selenium import webdriver
  2. browser = webdriver.Chrome()
  3. browser.get('https://example.com')
  4. input_element = browser.find_element_by_id('input_id')
  5. input_element.send_keys('输入的文本内容')</font>
复制代码
需要注意的是,确保输入框的定位准确,否则可能无法成功输入。
(二)点击操作
点击操作可以通过 click() 方法完成。比如,要点击一个按钮:
  1. <font size="3">button_element = browser.find_element_by_class_name('button_class')

  2. button_element.click()</font>
复制代码

在进行点击操作时,要保证元素处于可点击状态,并且定位准确。
(三)切换操作
切换操作包括页面切换和窗口切换。
页面切换可以通过 get() 方法加载新页面,或者使用 back() 方法返回上一页。
  1. <font size="3">browser.get('https://newpage.com')

  2. browser.back()</font>
复制代码

窗口切换需要先获取所有窗口的句柄,然后根据需要切换到指定窗口。
  1. <font size="3">current_windows = browser.window_handles
  2. browser.switch_to.window(current_windows[1])</font>
复制代码
在模拟用户交互时,要综合考虑页面的加载情况、元素的状态以及操作的顺序,合理运用等待机制,以确保操作的准确性和稳定性。



作者: 梦幻小丑灯    时间: 2024-7-24 16:06
五、处理动态内容

(一)延迟加载
延迟加载是应对动态内容的常见策略。通过延迟加载,页面在初始时仅加载可视区域内的关键元素,随着用户的滚动或交互再逐步加载其他内容。这样可以显著提高页面的初始加载速度,提升用户体验。实现延迟加载通常需要监听滚动事件,当元素进入可视区域时触发加载操作。例如,可以使用IntersectionObserver对象来监测元素是否可见,如下所示:
  1. const observer = new IntersectionObserver((entries) => {

  2.   entries.forEach(entry => {

  3.     if (entry.isIntersecting) {

  4.       // 加载元素的逻辑

  5.     }

  6.   });

  7. });

  8. const elementsToObserve = document.querySelectorAll('.lazy-load-element');

  9. elementsToObserve.forEach(element => observer.observe(element));
复制代码



(二)异步加载
异步加载常用于获取和渲染动态数据。例如,通过XMLHttpRequest或fetch发送异步请求获取数据,然后在回调函数中处理和渲染数据。这样可以避免阻塞页面的加载和渲染过程,提高页面的响应性。
  1. fetch('https://example.com/data')

  2. .then(response => response.json())

  3. .then(data => {

  4.     // 处理和渲染数据的逻辑

  5.   })

  6. .catch(error => {

  7.     // 处理错误的逻辑

  8.   });
复制代码



(三)动态脚本加载
在 APP 网页端,可能需要动态加载脚本以实现特定功能。可以使用document.createElement('script')创建<script>元素,并设置其src属性来加载脚本。同时,要注意脚本加载的顺序和依赖关系,以确保功能的正常运行。


(四)处理动态生成的元素
由于页面内容可能动态生成,在 Selenium 测试中需要确保准确地定位和操作这些元素。可以结合使用等待策略,如显性等待,确保元素在进行操作前已完全生成和可用。同时,要注意动态生成元素的属性和状态可能会发生变化,需要在测试代码中进行相应的处理和验证。
总之,应对 APP 网页端的动态加载内容需要综合运用多种技术和策略,根据具体的页面架构和业务需求进行优化和调整,以保障测试的准确性和稳定性。


六、结合 Appium 测试

Selenium 主要用于 Web 应用的自动化测试,而 Appium 则专注于移动应用。当将两者结合时,能够为移动应用测试带来诸多优势和广泛的应用场景。
在应用方面,Selenium 与 Appium 的结合可以实现对混合应用(包含 Web 视图的移动应用)的全面测试。通过这种结合,既能对应用中的 Web 部分使用 Selenium 进行测试,又能借助 Appium 对原生移动组件进行测试,确保整个应用的功能完整性和稳定性。
例如,在一个电商移动应用中,登录和注册页面可能是 Web 视图,而商品浏览、下单支付等功能则是原生移动组件。结合 Selenium 和 Appium 可以对这些不同部分进行连贯的测试,模拟用户从登录、浏览商品到下单支付的全过程。
其优势主要体现在以下几个方面:
首先,提高测试效率。无需为 Web 部分和原生移动部分分别构建独立的测试框架,减少了测试准备和维护的工作量。
其次,增强测试覆盖度。能够涵盖移动应用的各种场景和功能,包括不同操作系统、设备型号和屏幕尺寸等。
再者,代码复用性提高。Selenium 中编写的一些通用测试逻辑和方法,在与 Appium 结合的测试中可以部分复用,节省代码开发时间。
最后,统一测试管理。可以在一个测试项目中整合两种测试框架,便于测试用例的管理、执行和结果分析。
总之,Selenium 与 Appium 的结合为移动应用测试提供了更强大、更高效、更全面的解决方案,是当今移动应用开发中保障质量的重要手段。


七、实战案例分析

案例一:电商 APP 网页端登录功能测试
假设我们要对一个电商 APP 的网页端登录功能进行测试。首先,通过driver.get('电商登录页面 URL')导航到登录页面。
使用driver.find_element_by_id('username')和driver.find_element_by_id('password')定位用户名和密码输入框。
接着,使用send_keys()方法输入用户名和密码,例如:
  1. username_input = driver.find_element_by_id('username')

  2. username_input.send_keys('test_user')

  3. password_input = driver.find_element_by_id('password')

  4. password_input.send_keys('test_password')
复制代码



然后,定位登录按钮并点击:
  1. login_button = driver.find_element_by_id('login_btn')

  2. login_button.click()
复制代码

在这个过程中,需要注意用户名和密码输入框的定位是否准确。同时,可能会出现网络延迟导致登录响应较慢的情况,此时可以使用显性等待WebDriverWait来确保登录操作完成后再进行后续判断。
案例二:社交 APP 网页端消息发送功能测试
以社交 APP 的网页端消息发送为例。先导航到消息发送页面:driver.get('消息发送页面 URL')。
定位接收者输入框、消息内容输入框和发送按钮:
  1. receiver_input = driver.find_element_by_name('receiver')

  2. message_input = driver.find_element_by_class_name('message')

  3. send_button = driver.find_element_by_xpath('//button[contains(text(), "发送")]')
复制代码



输入接收者和消息内容并点击发送按钮:
  1. receiver_input.send_keys('friend_name')

  2. message_input.send_keys('Hello!')

  3. send_button.click()
复制代码



这里要注意输入内容的合法性验证以及发送按钮的可点击状态。对于消息发送的结果,可能需要等待一段时间来获取反馈,同样可以运用等待策略来保证测试的准确性。
总之,在实际的 APP 网页端测试中,要根据具体的功能和页面结构,灵活运用 Selenium 的各种方法和等待策略,同时注意处理可能出现的异常情况,以确保测试的全面和有效。







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2