【发布时间】:2022-01-19 05:53:40
【问题描述】:
如何为以下突出显示的元素派生 xpath?因为我看到所有类名都是相同的。我也尝试过使用父子遍历,但它不起作用,因为所有 4 个子元素都具有相同的属性。我不能使用“Samsung - S10”文本,因为它是一个变量,并且会因相应的设备而改变。
【问题讨论】:
标签: python css selenium xpath appium
如何为以下突出显示的元素派生 xpath?因为我看到所有类名都是相同的。我也尝试过使用父子遍历,但它不起作用,因为所有 4 个子元素都具有相同的属性。我不能使用“Samsung - S10”文本,因为它是一个变量,并且会因相应的设备而改变。
【问题讨论】:
标签: python css selenium xpath appium
作为最后的手段,我总是使用 xpath 索引。我知道这不是最佳做法,但它总是对我有用。
你可以试试:
(//dd[@class='m-0 text-base'])[1]
应该代表第一个节点,可以换成[2],[3]分别定位第2个和第3个节点。
另外,不确定您是否可以在 xpath 中使用 Device Protected,如果可以,那么我们必须使用它,并且我们可以消除 xpath 索引。
【讨论】:
我认为,对于您突出显示的文本,您可以使用以下xpath:
//div[@class='mb-3' and contains(@style, 'display: grid;')]//dl//dt[contains(text(), 'DEVICE PROTECTED')]/following-sibling::dd
从那里,您可以将此 xpath 插入驱动程序,然后将元素放入列表中
my_xpath = "//div[@class='mb-3' and contains(@style, 'display: grid;')]//dl//dt[contains(text(), 'DEVICE PROTECTED')]/following-sibling::dd"
myElements = driver.find_elements(By.XPATH, my_xpath)
获得元素列表后,您可以获取每个元素的 text 并随心所欲地使用它
my_xpath = "//div[@class='mb-3' and contains(@style, 'display: grid;')]//dl//dt[contains(text(), 'DEVICE PROTECTED')]/following-sibling::dd"
my_list_length = driver.find_elements(By.XPATH, my_xpath).__len__()
for rec_num in range(my_list_length):
newXPath = "{0}[{1}]".format(my_xpath, f'{rec_num + 1}')
ourElement = driver.find_element(By.XPATH, newXPath)
print(f'new element text: {ourElement.text}')
如果只有 1 条记录显示并且您只需要设备名称,那么您也可以这样做:
my_xpath = "//div[@class='mb-3' and contains(@style, 'display: grid;')]//dl//dt[contains(text(), 'DEVICE PROTECTED')]/following-sibling::dd"
myText = driver.find_element(By.XPATH, my_xpath).text
【讨论】: