在 Selenium 中使用 Xpath 查找嵌套元素不起作用

问题描述 投票:0回答:2

给出以下站点和定位器:

https://ultimateqa.com/automation

XPATH

CONTAINER = (By.XPATH, '//ul[@class="bottom-nav"]')
MENU = (By.XPATH, '//li[contains(@class, "menu-item")]')

CSS

BOTTOM_NAV = (By.CSS_SELECTOR, '.bottom-nav')
MENU_ITEM = (By.CSS_SELECTOR, '.menu-item')

我需要在 BOTTOM_NAV 中找到 MENU_ITEMS 的数量。

使用嵌套 CSS 时,它可以正常工作并返回预期的菜单项数量,即 7: parent_css_element.find_elements(css_element)

当尝试相同但使用 XPATH 定位器时,它不起作用,父元素内的元素更多 21 甚至更多: parent_xpath_element.find_elements(xpath_element)

我试图弄清楚为什么在嵌套元素中搜索不能使用 xpath 定位器,但可以使用 css 选择器正常工作?

html css selenium-webdriver xpath css-selectors
2个回答
1
投票

在嵌套元素中搜索时 CSS 选择器和 XPath 定位器之间的行为差异可能是由于它们处理搜索上下文的方式所致。 CSS 选择器自然地维护嵌套元素内的上下文,而 XPath 定位器可能需要在 XPath 表达式的开头使用点 (.) 显式指定上下文。添加点 (.) 可确保 XPath 定位器在特定父元素内搜索。

致以诚挚的问候


0
投票

参考以下代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://ultimateqa.com/automation")

wait = WebDriverWait(driver, 20)
# Below line can be used to close the subscribe pop-up which appears intermittently
# wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@class='formkit-close']"))).click()

# Store parent element
parent_element = wait.until(EC.visibility_of_element_located((By.XPATH, '//ul[@class="bottom-nav"]')))

# Store all the li elements within parent element
count = parent_element.find_elements(By.XPATH, "li")

# print count of li elements
print(len(count))

控制台结果:

7

Process finished with exit code 0
© www.soinside.com 2019 - 2024. All rights reserved.