selenium 如何在XPath字符串中插入元素引用?

jslywgbw  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(186)

给定一个UI元素引用,我如何向其“附加”一个字符串,以便找到它的下一个XCUIElementTypeStaticText类型的同级元素?
我使用的框架包含一个driver_helper.py文件。
该文件中的find_elementfind_elements方法定义如下:

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)
我希望找到其中一个复选框的兄弟元素,但下面这段代码:

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)
print("checkbox 0 sibling element text: " + str(test))

失败并显示NoSuchElementError: An element could not be located on the page using the given search parameters.我已包含屏幕的域的屏幕截图,以显示复选框确实存在,并且旁边有一个XCUIElementTypeStaticText
IOS应用程序屏幕的域名:

<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"/>
<XCUIElementTypeButton type="XCUIElementTypeButton" name="Square" label="Square" enabled="true" visible="true" accessible="true" x="15" y="542" width="20" height="21" index="26"/>
<XCUIElementTypeStaticText type="XCUIElementTypeStaticText" value="checkbox 3 text" name="checkbox 3 text" label="checkbox 3 text" enabled="true" visible="true" accessible="true" x="43" y="542" width="333" height="86" index="27"/>
<XCUIElementTypeButton type="XCUIElementTypeButton" name="Square" label="Square" enabled="true" visible="true" accessible="true" x="15" y="657" width="20" height="21" index="28"/>
<XCUIElementTypeStaticText type="XCUIElementTypeStaticText" value="checkbox 4 text" name="checkbox 4 text" label="checkbox 4 text" enabled="true" visible="true" accessible="true" x="43" y="657" width="320" height="52" index="29"/>
tcomlyy6

tcomlyy61#

如果您可以在driver_helper.py中添加方法,则可以使用此answer中提供的解决方案在那里实现方法
但如果您无法做到这一点,则需要更改sibling变量的代码。现在,您正在尝试将一个元素放入XPath中,但当您将对象放入字符串中时,这是不起作用的。
因此,解决方法是将您用来查找父元素的XPath字符串放在那里。
当您将所有复选框放入一个列表中时,您可以遍历它们并获得兄弟项,如下所示:

for i in range(len(checkboxes)):
    sibling = (sc.BY_XPATH, f'(//XCUIElementTypeButton[@name="Square"])[{i+1}]/following-sibling::XCUIElementTypeStaticText')
    test = self.driver_helper.find_element(sibling)
    print(f"checkbox {i+1} sibling element text: {test.text}")
wgxvkvu9

wgxvkvu92#

将所有XPath存储在一个变量中:

main_element = "//*[@id="submenu1"]/a[2]"

element = driver.find_element(By.XPATH, main_element)

siblingElement = main_element + "/following-sibling::td"

element2 = driver.find_element(By.XPATH, siblingElement)
3ks5zfa0

3ks5zfa03#

您不能在XPath字符串中插入WebElement对象/引用,因为XPath表达式应该是字符串,正如您自己所说的。
您可以做的是根据现有元素定位另一个元素。
例如,如果要根据现有元素查找/following-sibling::td,可以执行以下操作:

element = driver.find_element(By.XPATH, '//*[@id="submenu1"]/a[2]')
siblingElement = element.find_element(By.XPATH, './following-sibling::td')

1.在第二行中,我将find_element方法应用于element对象,而不是driver对象。
1.XPath表达式以点.开头,以通知此相对XPath与当前节点相关。
1.现在使用find_element(By.XPATH,,不推荐使用find_element_by_xpath

更新

如果要查找元素列表的兄弟元素,可以执行以下操作:

base_elements = driver.find_elements(By.XPATH, 'the_xpath_locator')
for element in base_elements:
    siblingElement = element.find_element(By.XPATH, './following-sibling::td')

相关问题