CN117591438A - 一种ui组件原子化的自动化测试方法及相关装置 - Google Patents

一种ui组件原子化的自动化测试方法及相关装置 Download PDF

Info

Publication number
CN117591438A
CN117591438A CN202410079479.6A CN202410079479A CN117591438A CN 117591438 A CN117591438 A CN 117591438A CN 202410079479 A CN202410079479 A CN 202410079479A CN 117591438 A CN117591438 A CN 117591438A
Authority
CN
China
Prior art keywords
component
condition
test
components
class
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202410079479.6A
Other languages
English (en)
Other versions
CN117591438B (zh
Inventor
曹立品
丁一
黄海亮
白剑
张海林
鲁和平
李长杰
陈焕然
李乐
王浩
洪行健
冷冬
李尚然
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Yifang Information Technology Co ltd
Original Assignee
Yifang Information Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Yifang Information Technology Co ltd filed Critical Yifang Information Technology Co ltd
Priority to CN202410079479.6A priority Critical patent/CN117591438B/zh
Publication of CN117591438A publication Critical patent/CN117591438A/zh
Application granted granted Critical
Publication of CN117591438B publication Critical patent/CN117591438B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种UI组件原子化的自动化测试方法及相关装置,其中,所述方法包括:开发元素组件类和条件组件类,元素组件类中定义了元素组件的定位方法,条件组件类中定义了条件组件的判断方法;获得UI测试需求,并基于元素组件类和条件组件类获得UI测试需求的元素组件的定位信息和条件组件的条件信息;根据UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式;基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,获得UI的测试脚本;基于测试脚本对UI进行自动化测试处理。在本发明实施例中,通过组件化和封装,实现在UI的元素或页面结构变换时,无需对测试脚本进行大规模修改,降低工作量。

Description

一种UI组件原子化的自动化测试方法及相关装置
技术领域
本发明涉及软件技术领域,尤其涉及一种UI组件原子化的自动化测试方法及相关装置。
背景技术
写UI自动化测试时,针对元素表达式的封装,在遵循xpath语法规范的情况下,利用xpath语法可实现模糊匹配、轴定位、条件组合等特点的定位表达式,有时候为了写出唯一定位到元素的表达式,可能要写多种条件和层级的结合,这样一来,一个xpath元素表达式可能会有多个层级,而这些元素可以按层级和条件分为不同部分,这些部分在一些众多元素中是重复编写的,所以能否针对不同的整层做一个拆分,将每个层级以组件化的思想来封装,作为元素表达式的最小单元,从而解决元素表达式大部分相同而少部分不同的情况,如此,维护表达式时,是否就能减少工作量,因为组件化拆分最小元素粒子后,只需修改一处,便可以引起所有引用组件的生成表达式的变更。而不需要维护重复的一个个元素。
发明内容
本发明的目的在于克服现有技术的不足,本发明提供了一种UI组件原子化的自动化测试方法及相关装置,通过组件化和封装,实现在UI的元素或页面结构变换时,无需对测试脚本进行大规模修改,降低工作量。
为了解决上述技术问题,本发明实施例提供了一种UI组件原子化的自动化测试方法,所述方法包括:
开发元素组件类和条件组件类,所述元素组件类中定义了元素组件的定位方法,所述条件组件类中定义了条件组件的判断方法;
获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件的定位信息和条件组件的条件信息;
根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式;
基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,获得UI的测试脚本;
基于所述测试脚本对所述UI进行自动化测试处理。
可选的,所述方法还包括:
在UI发生变化时,获得所述UI中的变化元素,并基于变化元素对所述测试脚本中所述XPath表达式对应的元素组件进行更新处理。
可选的,所述开发元素组件类和条件组件类,包括:
获得UI中的元素组件和条件组件,基于所述元素组件和所述条件组件开发对应的元素组件类和对应的条件组件类。
可选的,所述获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件和条件组件,包括:
对所述UI进行测试需求的分析处理,获得所述UI测试需求;
基于所述元素组件类中的定位方法对所述UI测试需求中的元素组件进行定位处理,获得UI测试需求中的元素组件的定位信息;
基于所述条件组件类中的判断方法对所述UI测试需求中的条件组件进行判断处理,获得UI测试需求中的条件组件的条件信息。
可选的,所述根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式,包括:
获得所述UI测试需求中的元素,并利用组件化的工具对所述元素进行拆分处理,获得元素组件和条件组件;
基于所述元素组件的定位信息和所述条件组件的条件信息构建XPath表达式。
可选的,所述基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,包括:
获得所述UI的页面对象类,并根据所述XPath表达式使用所述页面对象类进行测试脚本的编辑操作处理。
可选的,所述基于所述测试脚本对所述UI进行自动化测试处理,包括:
基于自动化技术控制所述测试脚本对所述UI进行自动化测试处理。
另外,本发明实施例还提供了一种UI组件原子化的自动化测试装置,所述装置包括:
开发模块:用于开发元素组件类和条件组件类,所述元素组件类中定义了元素组件的定位方法,所述条件组件类中定义了条件组件的判断方法;
获得模块:用于获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件的定位信息和条件组件的条件信息;
构建模块:用于根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式;
编辑操作模块:用于基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,获得UI的测试脚本;
自动化测试模块:用于基于所述测试脚本对所述UI进行自动化测试处理。
另外,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上述中任意一项所述的自动化测试方法。
另外,本发明实施例还提供了一种电子设备,所述电子设备包括:
一个或多个处理器;
存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个应用程序配置用于:执行根据上述中任意一项所述的自动化测试方法。
在本发明实施例中,通过元素组件化和封装,当元素的属性或页面结构发生变化时,只需在少数位置更新代码,减少了重复性工作;清晰的组件命名和结构使代码易于理解和维护;常用的元素定位和条件判断逻辑被封装为可重用的组件,便于在多个测试脚本中使用;可以轻松应对UI变动和新增的测试需求,提高了测试脚本的适应性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见的,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1是本发明实施例中的UI组件原子化的自动化测试方法的流程示意图;
图2是本发明实施例中的UI组件原子化的自动化测试装置的结构组成示意图;
图3是本发明实施例中的电子设备的结构组成示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
实施例一,请参阅图1,图1是本发明实施例中的UI组件原子化的自动化测试方法的流程示意图。
如图1所示,一种UI组件原子化的自动化测试方法,所述方法包括:
S11:开发元素组件类和条件组件类,所述元素组件类中定义了元素组件的定位方法,所述条件组件类中定义了条件组件的判断方法;
在本发明具体实施过程中,所述开发元素组件类和条件组件类,包括:获得UI中的元素组件和条件组件,基于所述元素组件和所述条件组件开发对应的元素组件类和对应的条件组件类。
具体的,首先是需要获得UI中的元素组件和条件组件,并且通过元素组件和条件组件开发对应的元素组件类和对应的条件组件类;元素组件类(ElementComponents)的代码如下:
class ElementComponents:
@staticmethod
def tag_with_attribute(tag, attribute, value):
return f"//{tag}[@{attribute}='{value}']"
@staticmethod
def tag_contains(tag, text):
return f"//{tag}[contains(text(), '{text}')]"
@staticmethod
def descendant(tag):
return f"descendant::{tag}"
@staticmethod
def parent(tag):
return f"parent::{tag}"
@staticmethod
def following_sibling(tag):
return f"following-sibling::{tag}"
@staticmethod
def preceding_sibling(tag):
return f"preceding-sibling::{tag}"
@staticmethod
def child(tag):
return f"child::{tag}"
@staticmethod
def element_with_id(id_value):
return f"//*[@id='{id_value}']"
@staticmethod
def element_with_class(class_name):
return f"//*[contains(concat(' ', normalize-space(@class), ' '), '{class_name} ')]"
@staticmethod
def any_tag():
return "//*"
@staticmethod
def tag_with_multiple_attributes(tag, **attributes):
conditions = [f"@{k}='{v}'" for k, v in attributes.items()]
return f"//{tag}[{' and '.join(conditions)}]"
@staticmethod
def tag_with_partial_attribute(tag, attribute, partial_value):
return f"//{tag}[contains(@{attribute}, '{partial_value}')]"
@staticmethod
def sibling_of_tag(tag, sibling_tag):
return f"//{tag}/following-sibling::{sibling_tag}"
@staticmethod
def child_of_class(parent_class, child_tag):
return f"//*[contains(@class, '{parent_class}')]/child::{child_tag}"
条件组件类(ConditionComponents)的代码如下:
class ConditionComponents:
@staticmethod
def or_condition(*expressions):
return f"{' or '.join(expressions)}"
@staticmethod
def and_condition(*expressions):
return f"{' and '.join(expressions)}"
@staticmethod
def contains_text(text):
return f"contains(text(), '{text}')"
@staticmethod
def index(index):
return f"position() = {index}"
@staticmethod
def element_is_visible():
return "not(@style='display:none')"
@staticmethod
def element_is_enabled():
return "not(@disabled)"
@staticmethod
def attribute_value_contains(attribute, value):
return f"contains(@{attribute}, '{value}')"
@staticmethod
def not_condition(expression):
return f"not({expression})"
@staticmethod
def starts_with_text(text):
return f"starts-with(text(), '{text}')"
@staticmethod
def attribute_equals(attribute, value):
return f"@{attribute}='{value}'"
@staticmethod
def has_attribute(attribute):
return f"@{attribute}"
@staticmethod
def element_with_text(text):
return f"text()='{text}'"
@staticmethod
def last_element():
return "last()"
并且在元素组件类中定义了元素组件的定位方法,在条件组件类中定义了条件组件的判断方法。
S12:获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件的定位信息和条件组件的条件信息;
在本发明具体实施过程中,所述获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件和条件组件,包括:对所述UI进行测试需求的分析处理,获得所述UI测试需求;基于所述元素组件类中的定位方法对所述UI测试需求中的元素组件进行定位处理,获得UI测试需求中的元素组件的定位信息;基于所述条件组件类中的判断方法对所述UI测试需求中的条件组件进行判断处理,获得UI测试需求中的条件组件的条件信息。
具体的,通过对UI进行测试需求分析,即可得到UI测试需求;然后通过元素组件类中的定位方法对UI测试需求中的元素组件进行定位处理,即可获得UI测试需求中的元素组件的定位信息;通过条件组件类中的判断方法对UI测试需求中的条件组件进行判断处理,即可获得UI测试需求中的条件组件的条件信息。
S13:根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式;
在本发明具体实施过程中,所述根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式,包括:获得所述UI测试需求中的元素,并利用组件化的工具对所述元素进行拆分处理,获得元素组件和条件组件;基于所述元素组件的定位信息和所述条件组件的条件信息构建XPath表达式。
具体的,首先是需要获得UI测试需求中的元素,并利用组件化的工具对所述元素进行拆分处理,获得元素组件和条件组件;然后根据元素组件的定位信息和条件组件的条件信息构建XPath表达式。
XPath表达式的组合实例如下:
# 示例应用
xpath_expression1=ElementComponents.tag_with_multiple_attributes("input",type="text", name="username") + \
"[" + ConditionComponents.element_is_visible() + "]"
xpath_expression2 = ElementComponents.child_of_class("container", "a") + \
"[" + ConditionComponents.contains_text("Click Here") + " and " + \
ConditionComponents.element_is_visible() + "]"
xpath_expression3 = ElementComponents.any_tag() + \
"[" + ConditionComponents.following_sibling("div") + " and " + \
ConditionComponents.index(1) + "]"
xpath_expression4 = ElementComponents.element_with_class("list-item")+ \
"[" + ConditionComponents.last_element() + "]"
XPath表达式示例:
print("XPath Expression 1:", xpath_expression1);
print("XPath Expression 2:", xpath_expression2);
print("XPath Expression 3:", xpath_expression3);
print("XPath Expression 4:", xpath_expression4)。
S14:基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,获得UI的测试脚本;
在本发明具体实施过程中,所述基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,包括:获得所述UI的页面对象类,并根据所述XPath表达式使用所述页面对象类进行测试脚本的编辑操作处理。
具体的,首先是需要获得UI的页面对象类,并且需要根据XPath表达式使用页面对象类进行测试脚本的编辑操作处理,即可生成测试脚本。
S15:基于所述测试脚本对所述UI进行自动化测试处理;
在本发明具体实施过程中,述基于所述测试脚本对所述UI进行自动化测试处理,包括:基于自动化技术控制所述测试脚本对所述UI进行自动化测试处理。
具体的,即通过自动化技术来控制测试脚本对UI进行自动化测试处理。
S16:在UI发生变化时,获得所述UI中的变化元素,并基于变化元素对所述测试脚本中所述XPath表达式对应的元素组件进行更新处理。
在本发明具体实施过程中,在UI发生变化时,需要获得UI中的变化元素,然后根据变换的元素针对性的对测试脚本中的述XPath表达式对应的元素组件进行更新处理。
具体的更新维护示例应用如下:
class PageObject:
def __init__(self):
# 假设这些是页面上的关键元素
self.login_button= ElementComponents.tag_with_attribute("button", "id", "login-button") + \
"[" + ConditionComponents.element_is_visible() + "]"
self.search_input= ElementComponents.tag_with_attribute("input", "name", "search") + \
"[" + ConditionComponents.element_is_enabled() + "]"
self.special_offer_banner= ElementComponents.tag_contains("div", "Special Offer") + \
"[" + ConditionComponents.element_is_visible() + "]"
# 示例方法,展示如何使用这些元素
def click_login(self):
# 这里只是示意,实际应用中会包含点击操作的代码
print(f"Clicking on element with XPath: {self.login_button}")
def enter_search_term(self, term):
# 同样,这里只是示意
print(f"Entering '{term}' into element with XPath: {self.search_input}")
def check_special_offer(self):
# 示例检查特别优惠的方法
print(f"Checking special offer element with XPath: {self.special_offer_banner}")。
假设页面上的登录按钮的ID从login-button变更为signin-button,或者搜索输入框的名称从search变更为query。在传统的方式中,我们需要在代码的多个地方更新这些值。但在这种组件化的方法中,我们只需要更新ElementComponents类中对应的方法调用参数:
登录按钮ID变更:只需在PageObject类中的login_button属性里修改ID值。
修改前:
self.login_button = ElementComponents.tag_with_attribute("button", "id", "login-button") + ...
修改后:
self.login_button = ElementComponents.tag_with_attribute("button", "id", "signin-button") + ...
搜索输入框名称变更:同样,在PageObject类中的search_input属性里修改名称值。
修改前
self.search_input = ElementComponents.tag_with_attribute("input", "name", "search") + ...
修改后:
self.search_input = ElementComponents.tag_with_attribute("input", "name", "query") + ...
在本发明实施例中,通过元素组件化和封装,当元素的属性或页面结构发生变化时,只需在少数位置更新代码,减少了重复性工作;清晰的组件命名和结构使代码易于理解和维护;常用的元素定位和条件判断逻辑被封装为可重用的组件,便于在多个测试脚本中使用;可以轻松应对UI变动和新增的测试需求,提高了测试脚本的适应性。
实施例二,请参阅图2,图2是本发明实施例中的UI组件原子化的自动化测试装置的结构组成示意图。
如图2所示,一种UI组件原子化的自动化测试装置,所述装置包括:
开发模块21:用于开发元素组件类和条件组件类,所述元素组件类中定义了元素组件的定位方法,所述条件组件类中定义了条件组件的判断方法;
在本发明具体实施过程中,所述开发元素组件类和条件组件类,包括:获得UI中的元素组件和条件组件,基于所述元素组件和所述条件组件开发对应的元素组件类和对应的条件组件类。
具体的,首先是需要获得UI中的元素组件和条件组件,并且通过元素组件和条件组件开发对应的元素组件类和对应的条件组件类;元素组件类(ElementComponents)的代码如下:
class ElementComponents:
@staticmethod
def tag_with_attribute(tag, attribute, value):
return f"//{tag}[@{attribute}='{value}']"
@staticmethod
def tag_contains(tag, text):
return f"//{tag}[contains(text(), '{text}')]"
@staticmethod
def descendant(tag):
return f"descendant::{tag}"
@staticmethod
def parent(tag):
return f"parent::{tag}"
@staticmethod
def following_sibling(tag):
return f"following-sibling::{tag}"
@staticmethod
def preceding_sibling(tag):
return f"preceding-sibling::{tag}"
@staticmethod
def child(tag):
return f"child::{tag}"
@staticmethod
def element_with_id(id_value):
return f"//*[@id='{id_value}']"
@staticmethod
def element_with_class(class_name):
return f"//*[contains(concat(' ', normalize-space(@class), ' '), '{class_name} ')]"
@staticmethod
def any_tag():
return "//*"
@staticmethod
def tag_with_multiple_attributes(tag, **attributes):
conditions = [f"@{k}='{v}'" for k, v in attributes.items()]
return f"//{tag}[{' and '.join(conditions)}]"
@staticmethod
def tag_with_partial_attribute(tag, attribute, partial_value):
return f"//{tag}[contains(@{attribute}, '{partial_value}')]"
@staticmethod
def sibling_of_tag(tag, sibling_tag):
return f"//{tag}/following-sibling::{sibling_tag}"
@staticmethod
def child_of_class(parent_class, child_tag):
return f"//*[contains(@class, '{parent_class}')]/child::{child_tag}"
条件组件类(ConditionComponents)的代码如下:
class ConditionComponents:
@staticmethod
def or_condition(*expressions):
return f"{' or '.join(expressions)}"
@staticmethod
def and_condition(*expressions):
return f"{' and '.join(expressions)}"
@staticmethod
def contains_text(text):
return f"contains(text(), '{text}')"
@staticmethod
def index(index):
return f"position() = {index}"
@staticmethod
def element_is_visible():
return "not(@style='display:none')"
@staticmethod
def element_is_enabled():
return "not(@disabled)"
@staticmethod
def attribute_value_contains(attribute, value):
return f"contains(@{attribute}, '{value}')"
@staticmethod
def not_condition(expression):
return f"not({expression})"
@staticmethod
def starts_with_text(text):
return f"starts-with(text(), '{text}')"
@staticmethod
def attribute_equals(attribute, value):
return f"@{attribute}='{value}'"
@staticmethod
def has_attribute(attribute):
return f"@{attribute}"
@staticmethod
def element_with_text(text):
return f"text()='{text}'"
@staticmethod
def last_element():
return "last()"
并且在元素组件类中定义了元素组件的定位方法,在条件组件类中定义了条件组件的判断方法。
获得模块22:用于获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件的定位信息和条件组件的条件信息;
在本发明具体实施过程中,所述获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件和条件组件,包括:对所述UI进行测试需求的分析处理,获得所述UI测试需求;基于所述元素组件类中的定位方法对所述UI测试需求中的元素组件进行定位处理,获得UI测试需求中的元素组件的定位信息;基于所述条件组件类中的判断方法对所述UI测试需求中的条件组件进行判断处理,获得UI测试需求中的条件组件的条件信息。
具体的,通过对UI进行测试需求分析,即可得到UI测试需求;然后通过元素组件类中的定位方法对UI测试需求中的元素组件进行定位处理,即可获得UI测试需求中的元素组件的定位信息;通过条件组件类中的判断方法对UI测试需求中的条件组件进行判断处理,即可获得UI测试需求中的条件组件的条件信息。
构建模块23:用于根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式;
在本发明具体实施过程中,所述根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式,包括:获得所述UI测试需求中的元素,并利用组件化的工具对所述元素进行拆分处理,获得元素组件和条件组件;基于所述元素组件的定位信息和所述条件组件的条件信息构建XPath表达式。
具体的,首先是需要获得UI测试需求中的元素,并利用组件化的工具对所述元素进行拆分处理,获得元素组件和条件组件;然后根据元素组件的定位信息和条件组件的条件信息构建XPath表达式。
XPath表达式的组合实例如下:
# 示例应用
xpath_expression1=ElementComponents.tag_with_multiple_attributes("input",type="text", name="username") + \
"[" + ConditionComponents.element_is_visible() + "]"
xpath_expression2 = ElementComponents.child_of_class("container", "a") + \
"[" + ConditionComponents.contains_text("Click Here") + " and " + \
ConditionComponents.element_is_visible() + "]"
xpath_expression3 = ElementComponents.any_tag() + \
"[" + ConditionComponents.following_sibling("div") + " and " + \
ConditionComponents.index(1) + "]"
xpath_expression4 = ElementComponents.element_with_class("list-item")+ \
"[" + ConditionComponents.last_element() + "]"
XPath表达式示例:
print("XPath Expression 1:", xpath_expression1);
print("XPath Expression 2:", xpath_expression2);
print("XPath Expression 3:", xpath_expression3);
print("XPath Expression 4:", xpath_expression4)。
编辑操作模块24:用于基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,获得UI的测试脚本;
在本发明具体实施过程中,所述基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,包括:获得所述UI的页面对象类,并根据所述XPath表达式使用所述页面对象类进行测试脚本的编辑操作处理。
具体的,首先是需要获得UI的页面对象类,并且需要根据XPath表达式使用页面对象类进行测试脚本的编辑操作处理,即可生成测试脚本。
自动化测试模块25:用于基于所述测试脚本对所述UI进行自动化测试处理;
在本发明具体实施过程中,述基于所述测试脚本对所述UI进行自动化测试处理,包括:基于自动化技术控制所述测试脚本对所述UI进行自动化测试处理。
具体的,即通过自动化技术来控制测试脚本对UI进行自动化测试处理。
更新模块26:用于在UI发生变化时,获得所述UI中的变化元素,并基于变化元素对所述测试脚本中所述XPath表达式对应的元素组件进行更新处理。
在本发明具体实施过程中,在UI发生变化时,需要获得UI中的变化元素,然后根据变换的元素针对性的对测试脚本中的述XPath表达式对应的元素组件进行更新处理。
具体的更新维护示例应用如下:
class PageObject:
def __init__(self):
# 假设这些是页面上的关键元素
self.login_button= ElementComponents.tag_with_attribute("button", "id", "login-button") + \
"[" + ConditionComponents.element_is_visible() + "]"
self.search_input= ElementComponents.tag_with_attribute("input", "name", "search") + \
"[" + ConditionComponents.element_is_enabled() + "]"
self.special_offer_banner= ElementComponents.tag_contains("div", "Special Offer") + \
"[" + ConditionComponents.element_is_visible() + "]"
# 示例方法,展示如何使用这些元素
def click_login(self):
# 这里只是示意,实际应用中会包含点击操作的代码
print(f"Clicking on element with XPath: {self.login_button}")
def enter_search_term(self, term):
# 同样,这里只是示意
print(f"Entering '{term}' into element with XPath: {self.search_input}")
def check_special_offer(self):
# 示例检查特别优惠的方法
print(f"Checking special offer element with XPath: {self.special_offer_banner}")。
假设页面上的登录按钮的ID从login-button变更为signin-button,或者搜索输入框的名称从search变更为query。在传统的方式中,我们需要在代码的多个地方更新这些值。但在这种组件化的方法中,我们只需要更新ElementComponents类中对应的方法调用参数:
登录按钮ID变更:只需在PageObject类中的login_button属性里修改ID值。
修改前:
self.login_button = ElementComponents.tag_with_attribute("button", "id", "login-button") + ...
修改后:
self.login_button = ElementComponents.tag_with_attribute("button", "id", "signin-button") + ...
搜索输入框名称变更:同样,在PageObject类中的search_input属性里修改名称值。
修改前
self.search_input = ElementComponents.tag_with_attribute("input", "name", "search") + ...
修改后:
self.search_input = ElementComponents.tag_with_attribute("input", "name", "query") + ...
在本发明实施例中,通过元素组件化和封装,当元素的属性或页面结构发生变化时,只需在少数位置更新代码,减少了重复性工作;清晰的组件命名和结构使代码易于理解和维护;常用的元素定位和条件判断逻辑被封装为可重用的组件,便于在多个测试脚本中使用;可以轻松应对UI变动和新增的测试需求,提高了测试脚本的适应性。
本发明实施例提供的一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现上述实施例中任意一个实施例的自动化测试方法。其中,所述计算机可读存储介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM、和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(Random AcceSS Memory,随即存储器)、EPROM(EraSable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically EraSable ProgrammableRead-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,存储设备包括由设备(例如,计算机、手机)以能够读的形式存储或传输信息的任何介质,可以是只读存储器,磁盘或光盘等。
本发明实施例还提供了一种计算机应用程序,其运行在计算机上,该计算机应用程序用于执行上述中任意一个实施例的自动化测试方法。
此外,图3是本发明实施例中的电子设备的结构组成示意图。
本发明实施例还提供了一种电子设备,如图3所示。所述电子设备包括处理器302、存储器303、输入单元304以及显示单元305等器件。本领域技术人员可以理解,图3示出的电子设备结构器件并不构成对所有设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件。存储器303可用于存储应用程序301以及各功能模块,处理器302运行存储在存储器303的应用程序301,从而执行设备的各种功能应用以及数据处理。存储器可以是内存储器或外存储器,或者包括内存储器和外存储器两者。内存储器可以包括只读存储器(ROM)、可编程 ROM(PROM)、电可编程ROM(EPROM)、电可擦写可编程ROM(EEPROM)、快闪存储器、或者随机存储器。外存储器可以包括硬盘、软盘、ZIP盘、U盘、磁带等。本发明所公开的存储器包括但不限于这些类型的存储器。本发明所公开的存储器只作为例子而非作为限定。
输入单元304用于接收信号的输入,以及接收用户输入的关键字。输入单元304可包括触控面板以及其它输入设备。触控面板可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触控面板上或在触控面板附近的操作),并根据预先设定的程序驱动相应的连接装置;其它输入设备可以包括但不限于物理键盘、功能键(比如播放控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。显示单元305可用于显示用户输入的信息或提供给用户的信息以及终端设备的各种菜单。显示单元305可采用液晶显示器、有机发光二极管等形式。处理器302是终端设备的控制中心,利用各种接口和线路连接整个设备的各个部分,通过运行或执行存储在存储器303内的软件程序和/或模块,以及调用存储在存储器内的数据,执行各种功能和处理数据。
作为一个实施例,所述电子设备包括:一个或多个处理器302,存储器303,一个或多个应用程序301,其中所述一个或多个应用程序301被存储在存储器303中并被配置为由所述一个或多个处理器302执行,所述一个或多个应用程序301配置用于执行上述实施例中的任意一实施例中的自动化测试方法。
在本发明实施例中,通过元素组件化和封装,当元素的属性或页面结构发生变化时,只需在少数位置更新代码,减少了重复性工作;清晰的组件命名和结构使代码易于理解和维护;常用的元素定位和条件判断逻辑被封装为可重用的组件,便于在多个测试脚本中使用;可以轻松应对UI变动和新增的测试需求,提高了测试脚本的适应性。
另外,以上对本发明实施例所提供的一种UI组件原子化的自动化测试方法及相关装置进行了详细介绍,本文中应采用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (10)

1.一种UI组件原子化的自动化测试方法,其特征在于,所述方法包括:
开发元素组件类和条件组件类,所述元素组件类中定义了元素组件的定位方法,所述条件组件类中定义了条件组件的判断方法;
获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件的定位信息和条件组件的条件信息;
根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式;
基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,获得UI的测试脚本;
基于所述测试脚本对所述UI进行自动化测试处理。
2.根据权利要求1所述的自动化测试方法,其特征在于,所述方法还包括:
在UI发生变化时,获得所述UI中的变化元素,并基于变化元素对所述测试脚本中所述XPath表达式对应的元素组件进行更新处理。
3.根据权利要求1所述的自动化测试方法,其特征在于,所述开发元素组件类和条件组件类,包括:
获得UI中的元素组件和条件组件,基于所述元素组件和所述条件组件开发对应的元素组件类和对应的条件组件类。
4.根据权利要求1所述的自动化测试方法,其特征在于,所述获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件和条件组件,包括:
对所述UI进行测试需求的分析处理,获得所述UI测试需求;
基于所述元素组件类中的定位方法对所述UI测试需求中的元素组件进行定位处理,获得UI测试需求中的元素组件的定位信息;
基于所述条件组件类中的判断方法对所述UI测试需求中的条件组件进行判断处理,获得UI测试需求中的条件组件的条件信息。
5.根据权利要求1所述的自动化测试方法,其特征在于,所述根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式,包括:
获得所述UI测试需求中的元素,并利用组件化的工具对所述元素进行拆分处理,获得元素组件和条件组件;
基于所述元素组件的定位信息和所述条件组件的条件信息构建XPath表达式。
6.根据权利要求1所述的自动化测试方法,其特征在于,所述基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,包括:
获得所述UI的页面对象类,并根据所述XPath表达式使用所述页面对象类进行测试脚本的编辑操作处理。
7.根据权利要求1所述的自动化测试方法,其特征在于,所述基于所述测试脚本对所述UI进行自动化测试处理,包括:
基于自动化技术控制所述测试脚本对所述UI进行自动化测试处理。
8.一种UI组件原子化的自动化测试装置,其特征在于,所述装置包括:
开发模块:用于开发元素组件类和条件组件类,所述元素组件类中定义了元素组件的定位方法,所述条件组件类中定义了条件组件的判断方法;
获得模块:用于获得UI测试需求,并基于所述元素组件类和所述条件组件类获得所述UI测试需求的元素组件的定位信息和条件组件的条件信息;
构建模块:用于根据所述UI测试需求利用元素组件的定位信息和条件组件的条件信息构建XPath表达式;
编辑操作模块:用于基于XPath表达式利用页面对象类进行测试脚本的编辑操作处理,获得UI的测试脚本;
自动化测试模块:用于基于所述测试脚本对所述UI进行自动化测试处理。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-7中任意一项所述的自动化测试方法。
10.一种电子设备,其特征在于,所述电子设备包括:
一个或多个处理器;
存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个应用程序配置用于:执行根据权利要求1至7中任意一项所述的自动化测试方法。
CN202410079479.6A 2024-01-19 2024-01-19 一种ui组件原子化的自动化测试方法及相关装置 Active CN117591438B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410079479.6A CN117591438B (zh) 2024-01-19 2024-01-19 一种ui组件原子化的自动化测试方法及相关装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410079479.6A CN117591438B (zh) 2024-01-19 2024-01-19 一种ui组件原子化的自动化测试方法及相关装置

Publications (2)

Publication Number Publication Date
CN117591438A true CN117591438A (zh) 2024-02-23
CN117591438B CN117591438B (zh) 2024-05-14

Family

ID=89913797

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410079479.6A Active CN117591438B (zh) 2024-01-19 2024-01-19 一种ui组件原子化的自动化测试方法及相关装置

Country Status (1)

Country Link
CN (1) CN117591438B (zh)

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105095088A (zh) * 2015-09-02 2015-11-25 厦门美图移动科技有限公司 基于uiautomator测试框架的计算器自动化测试方法和测试系统
US20150370688A1 (en) * 2014-06-20 2015-12-24 Vmware, Inc. Automatic updating of graphical user interface element locators based on dimension comparison
JP2016194777A (ja) * 2015-03-31 2016-11-17 エヌ・ティ・ティ・コムウェア株式会社 ソフトウェア試験装置、ソフトウェア試験方法及びソフトウェア試験用プログラム
CN106354649A (zh) * 2016-09-18 2017-01-25 郑州云海信息技术有限公司 一种分层式网页自动化测试脚本设计方法
CN112231229A (zh) * 2020-11-09 2021-01-15 恩亿科(北京)数据科技有限公司 Web UI自动化测试方法、系统、电子设备及可读存储介质
CN114036039A (zh) * 2021-10-11 2022-02-11 浙江中控技术股份有限公司 自动化测试框架的对象层构建方法和ui自动化测试框架
CN115543847A (zh) * 2022-10-31 2022-12-30 四川启睿克科技有限公司 一种基于ui设计稿自动生成测试用例的方法
CN115757100A (zh) * 2022-11-02 2023-03-07 华润数字科技有限公司 面向用户界面的自动化测试框架以及方法、设备、介质

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20150370688A1 (en) * 2014-06-20 2015-12-24 Vmware, Inc. Automatic updating of graphical user interface element locators based on dimension comparison
JP2016194777A (ja) * 2015-03-31 2016-11-17 エヌ・ティ・ティ・コムウェア株式会社 ソフトウェア試験装置、ソフトウェア試験方法及びソフトウェア試験用プログラム
CN105095088A (zh) * 2015-09-02 2015-11-25 厦门美图移动科技有限公司 基于uiautomator测试框架的计算器自动化测试方法和测试系统
CN106354649A (zh) * 2016-09-18 2017-01-25 郑州云海信息技术有限公司 一种分层式网页自动化测试脚本设计方法
CN112231229A (zh) * 2020-11-09 2021-01-15 恩亿科(北京)数据科技有限公司 Web UI自动化测试方法、系统、电子设备及可读存储介质
CN114036039A (zh) * 2021-10-11 2022-02-11 浙江中控技术股份有限公司 自动化测试框架的对象层构建方法和ui自动化测试框架
CN115543847A (zh) * 2022-10-31 2022-12-30 四川启睿克科技有限公司 一种基于ui设计稿自动生成测试用例的方法
CN115757100A (zh) * 2022-11-02 2023-03-07 华润数字科技有限公司 面向用户界面的自动化测试框架以及方法、设备、介质

Also Published As

Publication number Publication date
CN117591438B (zh) 2024-05-14

Similar Documents

Publication Publication Date Title
US8667456B1 (en) Cloud-based indexing for integrated development environments
US8392880B2 (en) Rapid application development for database-aware applications
US8433687B1 (en) Off-line indexing for client-based software development tools
JP2021064355A (ja) 自動検出されるターゲットラベルに基づくロボティックプロセスオートメーションアクティビティのネーミング(名付け)
US11054960B1 (en) Fuzzy target selection for robotic process automation
US11886895B2 (en) Enhanced target selection for robotic process automation
US20210165855A1 (en) String extraction and translation service
Goguen Social and semiotic analyses for theorem prover user interface design 1
CN116560683A (zh) 软件更新方法、装置、设备及存储介质
KR20080043345A (ko) 선언적으로 정의되는 컨트롤 액션
CN117591438B (zh) 一种ui组件原子化的自动化测试方法及相关装置
US9898314B2 (en) Javascript extension tool
Ţuţu et al. Dynamic reconfiguration via typed modalities
Soude et al. A model driven approach for unifying user interfaces development
Fatolahi et al. Towards a Semi-Automated Model-Driven Method for the Generation of Web-based Applications from Use Cases.
de Paz Tkinter GUI Application Development Cookbook: A practical solution to your GUI development problems with Python and Tkinter
CN114063868A (zh) 一种ai拖拽建模系统、方法、计算机设备及应用
CN114115835B (zh) 自动编码执行流程构建方法、装置、存储介质及智能终端
Shi et al. A Method of UML Sequence Diagram Verification Based on a Graph Grammar
Beres Sams teach yourself visual studio. NET 2003 in 21 days
US20240037325A1 (en) Ability to add non-direct ancestor columns in child spreadsheets
Moore et al. Python GUI Programming-A Complete Reference Guide: Develop responsive and powerful GUI applications with PyQt and Tkinter
CN117971190A (zh) 基于大语言模型的页面自动化操作生成方法及相关装置
Parsons et al. Professional Visual Studio 2005
Jordão et al. TypeTaxonScript: sugarifying and enhancing data structures in biological systematics and biodiversity research

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant