我试图获取Google趋势中似乎动态元素的xpath,导致控制台中出现奇怪的重新加载,这不允许我获取路径。正因为如此,我还尝试通过我看到的 id 进行选择,但仍然不起作用。
我试图做的是在搜索框中添加一个标题为"添加搜索词"的比较查询(在第一次单击同一元素之后(。
下面是一个示例网址: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。我假设这很可能与页面使用角度的事实有关。
我使用了以下代码并能够使其工作,但我认为我们总是会进入第二个搜索框。第一个搜索框是原始术语。
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