Я использую селен для переименования и сортировки носителя в папке на основе заголовка страницы, но страница по-прежнему загружает контент в фоновом режиме, и заголовок страницы меняется после того, как 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 можно создавать ботов для социальных сетей и мессенджеров.
Я сам отвечаю на этот вопрос, чтобы решить проблему, с которой я столкнулся, на случай, если у кого-то еще возникнет подобная проблема.
Я изучал это и обнаружил, что проблема не в коде. Проблема в разрешениях самого сайта.
Я выбрал вариант Allow Video and Audio
для Autoplay
в адресной строке и решил проблему.