<?xml version="1.0" encoding="UTF-8" ?>
<uimap>
<page name="login">
<uielement name="username">
<locator>//input[@type='text']</locator>
</uielement>
<uielement name="password">
<locator>//input[@type='password']</locator>
如果我有一个像上面这样的XML文件,我想要的是,如果我这样做了:
login.getlocator("username")
,其中login
是XML部分的对象,username
是XML部分的一个属性。 getlocator
只是一个我可能不得不写的函数名。
目标是,我想要定位器的值(我的意思是登录中包含的文本)。关于如何实现这一目标的任何建议?我查找了BeautifulSoup
,它使用Python进行XML解析,但还有其他选项吗?
答案 0 :(得分:0)
一种选择是使用lxml
并动态构造xpath表达式:
from lxml import etree as ET
data = """<?xml version="1.0" encoding="UTF-8" ?>
<uimap>
<page name="login">
<uielement name="username">
<locator>//input[@type='text']</locator>
</uielement>
<uielement name="password">
<locator>//input[@type='password']</locator>
</uielement>
</page>
</uimap>
"""
tree = ET.fromstring(data)
page = 'login'
element = 'username'
print tree.findtext('.//page[@name="{page}"]/uielement[@name="{element}"]/locator'.format(page=page, element=element))
打印:
//input[@type='text']
然后,您可以改进它并提取到可重用的功能,例如:
def get_locator(tree, page, element):
return tree.findtext('.//page[@name="{page}"]/uielement[@name="{element}"]/locator'.format(page=page, element=element), 'Not Found')
tree = ET.fromstring(data)
print get_locator(tree, 'login', 'username')
print get_locator(tree, 'login', 'password')
print get_locator(tree, 'login', 'invalid element')
打印:
//input[@type='text']
//input[@type='password']
Not Found
当然,这仍然可以改进,但我希望它至少能给你一个基本的想法。