首页 > 解决方案 > 当我在 selenium 中使用 Click() 时,页面中的动态元素(表)未更新,因此我无法检索新数据

问题描述

我需要从中抓取数据的页面Digikey 搜索结果

问题
它只允许在每个表中显示 100 行,因此我必须使用NextPageButton在多个表之间移动。如下面的代码所示,我实际上是这样做的,但是results每次第一个表结果时都会向我检索,并且不会在我的 click action 上移动到下一个表结果ActionChains(driver).click(element).perform()
请记住,没有打开新页面,单击将被某种 JavaScript 拦截以在同一页面上执行一些丰富的 UI 内容以加载新的数据表

我的期望
我只是想验证我可以移动到下一张表,然后我将编辑代码以遍历所有这些表。这段代码应该从结果中返回第二个表中的数据,但它实际上返回了最初使用 URL 加载的第一个表中的值。这意味着单击操作未发生或实际发生但WebDriver driver内容未通过与页面中的动态 JavaScript 元素交互而更新。

我将不胜感激任何帮助,谢谢..

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.webdriver import ActionChains
import time
import sys


url = "https://www.digikey.com/en/products/filter/coaxial-connectors-rf-terminators/382?s=N4IgrCBcoA5QjAGhDOl4AYMF9tA"

chrome_driver_path = "..PATH\\chromedriver"
chrome_options = Options() 
chrome_options.add_argument ("--headless") 

webdriver = webdriver.Chrome(
    executable_path= chrome_driver_path
    ,options= chrome_options 
)


with webdriver as driver:
    wait = WebDriverWait(driver, 10)
    driver.get(url)
    wait.until(presence_of_element_located((By.CSS_SELECTOR, "tbody")))
    
    element = driver.find_element_by_css_selector("button[data-testid='btn-next-page']")
    ActionChains(driver).click(element).perform()
    time.sleep(10) #too much time i know, but to make sure it is not a waiting issue. something needs to be updated

    results = driver.find_elements_by_css_selector("tbody")

    for count in results:
        countArr = count.text
        print(countArr)
        print()
    
    driver.close()

标签: pythonseleniumweb-scraping

解决方案


终于找到了解决方案!

解决方案的来源
正如预期的那样,问题出在点击操作本身。如解决方案源问题中所示,它在某种程度上没有正确完成或根本没有完成。

解决方案是使用 Javascript 执行单击按钮。
将第 30 行更改 ActionChains(driver).click(element).perform() 为:

driver.execute_script("arguments[0].click();",element)

而已..


推荐阅读