如何在XPath中引用UI元素,查找XCUIElementTypeStaticText兄弟元素
如何通过已知UI元素引用拼接XPath查找其XCUIElementTypeStaticText类型的兄弟元素
问题背景
你使用的框架包含driver_helper.py中的元素查找方法:
def find_element(self, locator: tuple) -> WebElement: return self.driver.find_element(*locator) def find_elements(self, locator: tuple) -> list[WebElement]: return self.driver.find_elements(*locator)
selector_const.py中定义了BY_XPATH = MobileBy.XPATH。
你通过以下代码获取了复选框列表:
self.CHECKBOXES = (sc.BY_XPATH, '//XCUIElementTypeButton[@name="Square"]') checkboxes = self.driver_helper.find_elements(self.CHECKBOXES)
但尝试直接拼接WebElement对象到XPath中查找兄弟元素时失败:
checkboxes = self.driver_helper.find_elements(self.CHECKBOXES) sibling = ( sc.BY_XPATH, f'{checkboxes[0]}/following-sibling::XCUIElementTypeStaticText', ) test = self.driver_helper.find_element(sibling)
报错:NoSuchElementError: An element could not be located on the page using the given search parameters.
页面DOM结构显示每个Square按钮后紧跟对应的XCUIElementTypeStaticText元素:
<XCUIElementTypeButton type="XCUIElementTypeButton" name="Square" label="Square" enabled="true" visible="true" accessible="true" x="15" y="428" width="20" height="21" index="22"/> <XCUIElementTypeStaticText type="XCUIElementTypeStaticText" value="checkbox 1 text" name="checkbox 1 text" label="checkbox 1 text" enabled="true" visible="true" accessible="true" x="43" y="428" width="308" height="18" index="23"/> <XCUIElementTypeButton type="XCUIElementTypeButton" name="Square" label="Square" enabled="true" visible="true" accessible="true" x="15" y="478" width="20" height="21" index="24"/> <XCUIElementTypeStaticText type="XCUIElementTypeStaticText" value="checkbox 2 text" name="checkbox 2 text" label="checkbox 2 text" enabled="true" visible="true" accessible="true" x="43" y="478" width="260" height="35" index="25"/>
错误原因
你错误地将WebElement对象直接拼接到XPath字符串中,checkboxes[0]是一个元素实例,不是有效的XPath表达式,因此无法被解析。
正确实现方式
方法1:通过WebElement进行相对定位(推荐)
直接在已找到的复选框元素上调用find_element,使用相对XPath查找其后续兄弟元素,这种方式最直观可靠:
checkboxes = self.driver_helper.find_elements(self.CHECKBOXES) # 获取第一个复选框对应的兄弟文本元素 sibling_locator = (sc.BY_XPATH, './following-sibling::XCUIElementTypeStaticText') static_text_element = checkboxes[0].find_element(*sibling_locator) print("checkbox 0 sibling element text: " + static_text_element.text)
这里的./表示从当前元素出发,查找同级的后续兄弟元素。
方法2:构造包含元素索引的XPath
从DOM结构可以看到,每个复选框的index值比对应的文本元素小1,因此可以通过索引来构造定位表达式:
# 获取第一个复选框的index属性 checkbox_index = checkboxes[0].get_attribute('index') # 构造文本元素的定位器,index为checkbox_index +1 sibling_locator = ( sc.BY_XPATH, f'//XCUIElementTypeStaticText[@index="{int(checkbox_index)+1}"]' ) static_text_element = self.driver_helper.find_element(sibling_locator) print("checkbox 0 sibling element text: " + static_text_element.text)
方法3:直接通过XPath一次性定位所有复选框对应的文本元素
无需先获取复选框列表,直接用XPath关联两者的位置关系:
# 定位所有Square按钮对应的后续静态文本元素 all_static_text_locator = ( sc.BY_XPATH, '//XCUIElementTypeButton[@name="Square"]/following-sibling::XCUIElementTypeStaticText' ) all_static_text_elements = self.driver_helper.find_elements(all_static_text_locator) # 遍历输出所有文本 for idx, elem in enumerate(all_static_text_elements): print(f"checkbox {idx+1} sibling element text: {elem.text}")
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

