当我在 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 正在改变。
在这个阶段,所有脚本的目的是找到数字图书馆中的搜索栏,发送我要查找的资源名称,单击它并获取当前 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 正在改变。