WebDriverWait получает заголовок, но JavaScript или что-то меняет заголовок браузера после загрузки страницы

Я использую селен для переименования и сортировки носителя в папке на основе заголовка страницы, но страница по-прежнему загружает контент в фоновом режиме, и заголовок страницы меняется после того, как Firefox завершил загрузку и отображение контента.

Всякий раз, когда я нажимаю на эпизод документального сериала, который не является первым эпизодом в сериале, возникает эта проблема. Он возвращает название эпизода, а не название сериала, но после того, как фоновое содержимое завершило загрузку заголовка браузера и текста html-тега, я после изменения названия сериала, чего я и хочу.️ 🔁

Я несколько дней искал в Google, а также здесь, на stackoverflow.com. Я просмотрел почти каждую часть модуля селена, пробуя разные вещи, плюс я просмотрел каждую часть веб-страницы в надежде найти что-то, что я могу использовать, чтобы заставить селен дождаться завершения загрузки контента, но безуспешно. .

Кроме того, в ответе на другой вопрос было рекомендовано использовать WebDriverWait с expected_conditions и стараться избегать time.sleep с selenium, и я это понимаю. Даже при высокоскоростном подключении к Интернету существует ряд факторов, которые могут замедлить время загрузки веб-страницы, что может сделать time.sleep нестабильной.

Я начал с самого названия, используя...

import selenium.webdriver.support.expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait

browser = Firefox()
wait = WebDriverWait(driver = browser, timeout = 30)

browser.get('https://curiositystream.com/video/3558')
wait.until_not(ec.title_is(current_title))

Но на данный момент я с этим смирился. Проблема, с которой я сталкиваюсь, возникает не так часто, но проблема все еще существует.

print(wait.until(
    ec.visibility_of_element_located((
        'xpath',
        '//button[@aria-expanded = "false" and @class = "inline-block cursor-pointer"]'
        '/span[@class = "leading-tight text-lg tablet:text-2xl font-normal" and contains(@aria-label,"Show")]'
    ))).text, end = ' ')

if len(browser.find_elements(
        by = 'xpath',
        value = '//div[@class = "pt-4"]/p[@class = "font-medium text-light pt-2"]'
)) > 0:
    print('(Docuseries)')
else:
    print('(Documentary)')

Это не настоящий источник того, что я написал, но он может воспроизвести мою проблему. Я надеюсь, что кто-то захочет изучить селен и Curiosity Stream, чтобы помочь мне найти решение, которое будет работать без использования time.sleep.

from contextlib import suppress
from os import getpid, kill
from re import compile
from signal import SIGTERM
from time import sleep  # noqa

import selenium.common.exceptions as exc
import selenium.webdriver.support.expected_conditions as ec
from selenium.webdriver import Firefox
from selenium.webdriver.support.wait import WebDriverWait

# from library import Firefox

if __name__ == '__main__':
    browser = Firefox()
    wait = WebDriverWait(driver = browser, timeout = 30)

    browser.set_window_rect(x = 960, y = 10, width = 1920, height = 1580)
    browser.get('https://curiositystream.com/')

    url = compile(r'https://curiositystream.com/video/[0-9]+')

    # current_url = current_title = ''
    current_url, current_title = browser.current_url, browser.title
    try:
        while True:
            if current_url != browser.current_url:
                current_url = browser.current_url

                wait.until_not(ec.title_is(current_title))

                if url.match(string = browser.current_url):
                    current_title = browser.title

                    if (button := next((_ for _ in browser.find_elements(
                            by = 'xpath',
                            value = '//button[@class = "vjs-big-play-button" and '
                                    '@type = "button" and '
                                    '@title = "Play Video" and '
                                    '@aria-disabled = "false"]'
                    )), None)) is not None:
                        with suppress(
                                exc.StaleElementReferenceException,
                                exc.ElementNotInteractableException
                        ):
                            button.click()

                    # sleep(wait.__dict__['_poll'])
                    print(wait.until(
                        ec.visibility_of_element_located((
                            'xpath',
                            '//button[@aria-expanded = "false" and @class = "inline-block cursor-pointer"]'
                            '/span[@class = "leading-tight text-lg tablet:text-2xl font-normal" and contains(@aria-label,"Show")]'
                        ))).text, end = ' ')

                    if len(browser.find_elements(
                            by = 'xpath',
                            value = '//div[@class = "pt-4"]/p[@class = "font-medium text-light pt-2"]'
                    )):
                        print('(Docuseries)')
                    else:
                        print('(Documentary)')
    except exc.NoSuchWindowException:
        kill(getpid(), SIGTERM)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сам отвечаю на этот вопрос, чтобы решить проблему, с которой я столкнулся, на случай, если у кого-то еще возникнет подобная проблема.

Я изучал это и обнаружил, что проблема не в коде. Проблема в разрешениях самого сайта.

Я выбрал вариант Allow Video and Audio для Autoplay в адресной строке и решил проблему.

Другие вопросы по теме