当我在 chrome 中打开开发人员工具时,Selenium 仅定位元素

Selenium only locates element when I open developer tools in chrome

在这个阶段,所有脚本的目的是找到数字图书馆中的搜索栏,发送我要查找的资源名称,单击它并获取当前 url。第一位(将键发送到搜索栏)工作正常。但我注意到第二个 try/finally 块仅在我右键单击并检查页面上的任何元素时才执行。如果我不这样做,我会收到以下错误消息:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="ember767"]"}

我的代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains


PATH = "/Applications/chromedriver"
ser = Service(PATH)
driver = webdriver.Chrome(service=ser)
driver.maximize_window()
driver.implicitly_wait(20)

driver.get("https://browzine.com/libraries/1374/subjects")
print("Enter targeted Journal name:")
targeted_journal = input()
wait = WebDriverWait(driver, 10)


try:

    button = driver.find_element(By.ID, "ember648")
    driver.implicitly_wait(10)
    ActionChains(driver).move_to_element(button).click(button).perform()
    button.send_keys(targeted_journal)
    button.send_keys(Keys.RETURN)

finally:
    pass

# step 2 : click targeted journal and get current url

try:
    driver.implicitly_wait(20)
    click_journal = driver.find_element(By.ID, "ember767") 
    ActionChains(driver).move_to_element(click_journal).click(click_journal).perform()
    targeted_url = driver.current_url

finally:
    pass

print(targeted_url)
driver.quit()

更新 - 找到答案

最初为目标元素收集的 ID 是一个动态 ID。只有当开发者工具 window 打开时才会如此。因此,脚本只能在单击“检查元素”时检测到该特定 ID,因为这是唯一为目标元素分配该特定 ID 的情况(在我的例子中为“ember767”)。 为避免此问题,改为使用 Xpath 来定位元素。请参阅下面 Mayank Shukla 的回答。

在某些情况下,元素的 ID 或其他属性会发生变化,或者鼠标悬停时会出现属性值。所以最好使用 xpath 来定位这些元素

在这种情况下,我认为元素的 id 在您悬停鼠标后发生了变化。尝试使用 xpath 并告诉我是否可行。因为这可能是在浏览器刷新后发生的,即元素的 id 正在改变。