Selenium - 无法在动态元素中获取 xpath

Selenium - Not able to get xpath in dynamic element

我正在尝试获取 Google Trends 中元素的 xpath,这似乎是动态的,导致控制台中出现奇怪的重新加载,这不允许我获取路径。因此,我也尝试通过我看到的 id 进行选择,但仍然无法正常工作。

我想做的是在搜索框中添加一个标题为 "add a search term" 的比较查询(在第一次点击同一元素后)。

这是一个例子url:https://trends.google.com/trends/explore?q=python%20programming&geo=US

难道我需要等待吗?当我尝试在控制台中检查时,我对隐藏的 html 感到困惑。

# click to add and compare query
driver.find_element_by_xpath('//*[@id="explorepage-content-header"]/explore-pills/div/button/span/span[1]').click()
time.sleep(10)

# find comparisson search box
driver.maximize_window() 
driver.implicitly_wait(20) 
ele = driver.find_element_by_id('input-139')
time.sleep(1)

ele.send_keys('r programming') <-- im not able to add this query in the comparison box
ele.send_keys(Keys.RETURN)

这是错误信息。

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="input-139"]"}
  (Session info: chrome=81.0.4044.138)

该页面似乎在页面重新加载期间以及在不同的浏览器上生成了不同的 ID。我假设这很可能与页面使用 angular.

这一事实有关

我已经使用了以下代码并且能够让它工作,但我假设我们总是要进入第二个搜索框。第一个搜索框是原始词。

search_boxes = driver.find_elements_by_css_selector('input[aria-label="Add a search term"]')
target_box = search_boxes[1] # Second Box, we're assuming there is always one term.

target_box.send_keys('r programming')
target_box.send_keys(Keys.RETURN)

输入字段有动态id,不能使用.find_element_by_id('input-139')。并尝试添加 WebDriverWait 如下所示:

driver.get('https://trends.google.com/trends/explore?q=python%20programming&geo=US')
compare = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, 'add-term-text')))
compare.click()
input_elmnt = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '#explorepage-content-header > explore-pills > div > div:nth-child(2)')))
action = ActionChains(driver)
action.move_to_element(input_elmnt).send_keys('r programming').send_keys(Keys.ENTER).perform()

以下导入:

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