【问题标题】:NoSuchElementException when loading code using Selenium on Heroku在 Heroku 上使用 Selenium 加载代码时出现 NoSuchElementException
【发布时间】:2022-07-06 10:52:16
【问题描述】:

错误:

ERROR:asyncio:Task exception was never retrieved

2022-03-14T14:08:52.425684+00:00 app[worker.1]: future: <Task finished name='Task-30' coro=<Dispatcher._process_polling_updates() done, defined at /app/.heroku/python/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py:407> exception=NoSuchElementException('no such element: Unable to locate element: {"method":"css selector","selector":".media-cards-grid"}\n  (Session info: headless chrome=99.0.4844.51)', None, ['#0 0x5586a25c17d3 <unknown>', '#1 0x5586a231d688 <unknown>', '#2 0x5586a2353c21 <unknown>', '#3 0x5586a2353de1 <unknown>', '#4 0x5586a2386d74 <unknown>', '#5 0x5586a23716dd <unknown>', '#6 0x5586a2384a0c <unknown>', '#7 0x5586a23715a3 <unknown>', '#8 0x5586a2346ddc <unknown>', '#9 0x5586a2347de5 <unknown>', '#10 0x5586a25f249d <unknown>', '#11 0x5586a260b60c <unknown>', '#12 0x5586a25f4205 <unknown>', '#13 0x5586a260bee5 <unknown>', '#14 0x5586a25e8070 <unknown>', '#15 0x5586a2627488 <unknown>', '#16 0x5586a262760c <unknown>', '#17 0x5586a2640c6d <unknown>', '#18 0x7f9745a5d609 <unknown>', ''])>

这里是代码有问题的部分:

    chrome_options = webdriver.ChromeOptions()
    chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN")
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--no-sandbox")
    driver = webdriver.Chrome(executable_path=os.environ.get("CHROMEDRIVER_PATH"), chrome_options=chrome_options)
    driver.get(link)
    block = driver.find_element(by=By.CLASS_NAME, value='media-cards-grid')
    all_image = block.find_elements(by=By.CLASS_NAME, value='media-card')
    all_image = all_image[0:10]

    for image in all_image:
        image_link = image.get_attribute('data-src')
        name = image.find_element(By.CLASS_NAME, 'media-card__title').text
        ref = image.get_attribute('href')
        manga = InlineKeyboardMarkup()
        manga.add(InlineKeyboardButton(name, url=ref))
        await bot.send_photo(chat_id=callback.message.chat.id, photo=image_link, reply_markup=manga)
    shwmrrslts = InlineKeyboardMarkup()
    shwmrrslts.add(InlineKeyboardButton('show more results', url=link))
    await callback.message.answer('if you want to see more, click on the button', reply_markup=shwmrrslts)

我在互联网上搜索了解决方案,但从未找到。 此外,这段代码在我的电脑上运行良好:

    driver = webdriver.Firefox()
    driver.get(link)
    block = driver.find_element(By.CLASS_NAME, 'media-cards-grid')
    all_image = block.find_elements(By.CLASS_NAME, 'media-card')
    all_image = all_image[0:10]
    # print(type(all_image))
    for image in all_image:
        image_link = image.get_attribute('data-src')
        name = image.find_element(By.CLASS_NAME, 'media-card__title').text
        ref = image.get_attribute('href')
        manga = InlineKeyboardMarkup()
        manga.add(InlineKeyboardButton(name, url=ref))
        await bot.send_photo(chat_id=callback.message.chat.id, photo=image_link, reply_markup=manga)
    shwmrrslts = InlineKeyboardMarkup()
    shwmrrslts.add(InlineKeyboardButton('show more results', url=link))
    await callback.message.answer('if you want to see more, click on the button', reply_markup=shwmrrslts)

抱歉我的英语不好,在此先感谢 对不起

【问题讨论】:

    标签: python selenium selenium-webdriver heroku nosuchelementexception


    【解决方案1】:

    此错误消息...

    NoSuchElementException('no such element: Unable to locate element: {"method":"css selector","selector":".media-cards-grid"
    

    ...暗示 NoSuchElementException 在尝试通过以下locator strategy 定位所需元素时引发:

    (by=By.CLASS_NAME, value='media-cards-grid')
    

    您需要构造一个更规范的locator strategy,它在DOM Tree 中唯一标识元素


    参考文献

    您可以在NoSuchElementException 上找到一些相关讨论:

    【讨论】:

      【解决方案2】:

      你好 Dan 我今天一直在努力解决这个问题,问题是 Heroku 比你的计算机管理 Chrome 慢,所以你必须让 Heroku 完成他们的工作。这样做对我有用导入:

      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.support.ui import WebDriverWait
      

      使用此方法,您可以转换 find_element 函数,例如

      block = driver.find_element(by=By.CLASS_NAME, value='media-cards-grid')
      

      进入

      wait = WebDriverWait(driver, 20)
      block = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'media-cards-grid')))
      

      请注意,EC.presence_of_all_elements_located 也已开发,以备不时之需。如果问题仍然存在,请增加等待时间,即 20。

      希望这能解决您的问题!

      【讨论】:

        【解决方案3】:

        我在 Heroku 上运行我的应用时遇到了同样的问题。当我在本地测试时,chromdwriver 会定位站点的 xPath,但无法在 Heroku 上找到它。

        这是我的 ChromeDriver 参数源代码Chromedriver args

        这里是 driver.getElement 的代码 by Xpath sectiongetElementby Xpath

        我已经配置了构建包和变量 buildpacks

        但是,在应用程序上运行 ChromeDriver 时它仍然给我错误,因为它显示在 Heroku 日志中 --tail

        Heroku logs --tail

        如果有人能帮我解决这个问题,我将不胜感激。

        【讨论】:

          猜你喜欢
          • 2022-01-17
          • 2021-08-16
          • 2020-11-04
          • 1970-01-01
          • 1970-01-01
          • 2018-10-25
          • 1970-01-01
          • 1970-01-01
          • 2019-10-13
          相关资源
          最近更新 更多