小能豆

如何使用 xpath/css 选择器单击 drupal 8 网站中的动态链接,同时通过 Selenium 和 Python 进行自动化

py

我尝试单击一个编辑选项卡链接,它以无序列表中的超链接形式显示。

HTML 代码如下:

<li><a href="/node/2658/edit" data-drupal-link-system-path="node/2658/edit">Edit</a></li>

我一直尝试使用driver.find_element_by_link_text('Edit')来查找元素,但总是得到一个NoSuchElementException

我也使用了部分文本 fxn 及其 html 的所有变体,并收到了同样的错误。

我还发现以下 html 包含正确的链接:

<link rel="edit-form" href="/node/2658/edit" />

是否有一个 selenium 函数可以用来转到这个编辑页面?


阅读 6

收藏
2024-10-29

共1个答案

小能豆

您可以尝试几种方法来点击“编辑”链接或直接跳转到编辑页面。出现 NoSuchElementException 错误通常是因为该元素尚未加载或页面内容嵌套在 iframe 中。下面是一些可能有效的方法:

方法 1:使用显式等待点击元素

使用 WebDriverWait 显式等待元素加载后再点击,这样可以确保元素在页面上可用时再进行操作。

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

# 等待 "Edit" 链接可点击后进行点击
edit_link = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.LINK_TEXT, "Edit"))
)
edit_link.click()

方法 2:使用 XPath 定位元素

如果 find_element_by_link_text()find_element_by_partial_link_text() 无效,尝试使用 XPath 定位元素。

edit_link = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//a[contains(@href, '/edit') and text()='Edit']"))
)
edit_link.click()

这个 XPath 会定位到带有“/edit”部分的 href 和文本为 “Edit” 的 <a> 元素。

方法 3:直接使用 <link> 标签的 href 属性导航

如果您不需要直接点击链接,可以从 <link rel="edit-form"> 标签中提取 URL 并直接导航到编辑页面。

# 直接从 <link> 标签中获取编辑页面 URL
edit_url = driver.find_element(By.XPATH, "//link[@rel='edit-form']").get_attribute("href")
driver.get(edit_url)

方法 4:检查链接是否在 iframe 中

如果该链接位于 iframe 中,则需要先切换到 iframe。

# 切换到 iframe(假设页面中只有一个 iframe)
driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))

# 定位并点击 "Edit" 链接
edit_link = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.LINK_TEXT, "Edit"))
)
edit_link.click()

# 切换回默认内容
driver.switch_to.default_content()

方法 5:检查 JavaScript 渲染

如果页面使用了 JavaScript 动态加载内容,可以等待整个页面加载完毕后再查找元素,或者使用 execute_script 方法直接调用页面上加载的函数(如果已知)。

尝试这些方法应该能够帮助您找到并成功点击“编辑”链接。

2024-10-29