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 можно создавать ботов для социальных сетей и мессенджеров.


71
1

Ответ:

Решено

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

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

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