原本的用例
def test_native(self):
self.driver.find_element(By.XPATH,"//*[@text='Native']").click()
self.driver.find_element(By.XPATH,"//*[@text='Native_Video']").click()
欲将find_element的查找方式类型和值及后续交互动作以YAML的方式存贮下来,如果UI元素改变,不需要修改原本用例代码,修改或者新增YAML即可。
将可能发生变更的元素查找放入YAML内:
创建解析YAML和处理查找定位的工具代码:
class YamlCase:
def __init__(self,path):
#open file
file = open(path,'r')
#read yaml to data
self.steps = yaml.safe_load(file)
def run(self,driver:WebDriver):
# traverse yamldata,then
for step in self.steps:
# if item is dict
if isinstance(step,dict):
# find element via key
# if key is id, find element by id
if 'id' in step.keys():
element = driver.find_element(By.ID,step['id'])
# if key is xpath , find element by xpath
elif 'xpath' in step.keys():
element = driver.find_element(By.XPATH,step['xpath'])
# if key is android UIAutomator , find element by ui automator
elif 'android_uiautomator' in step.keys():
element = driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,step['android_uiautomator'])
else:
print(step.keys())
# interaction
# if key is input , send keys
if 'input' in step.keys():
element.send_keys(step['input'])
# if key is get , get attribute
elif 'get' in step.keys():
element.get_attribute(step['get'])
# else click
else:
element.click()
最后, 原本用例只需要调用YamlCase类,
def test_native(self):
YamlCase('test_case.yaml').run(self.driver)