Проект: Экспорт с Selenium: различия между версиями

Меняем пример на Firefox
Нет описания правки
(Меняем пример на Firefox)
Строка 8: Строка 8:
Selenium состоит из двух главных частей: WebDriver, программа, управляющая браузером и библиотека для любимого вами языка. Я обычно загружаю WebDriver в свою пользовательскую директорию в Linux, "~/.local/bin" - директория, куда я могу складывать исполняемые файлы, она существует в переменной PATH как для Bash, так и для ZSH, этого мне достаточно. У вас может и не быть ZSH, поэтому правки "~/.bashrc" должно хватить.
Selenium состоит из двух главных частей: WebDriver, программа, управляющая браузером и библиотека для любимого вами языка. Я обычно загружаю WebDriver в свою пользовательскую директорию в Linux, "~/.local/bin" - директория, куда я могу складывать исполняемые файлы, она существует в переменной PATH как для Bash, так и для ZSH, этого мне достаточно. У вас может и не быть ZSH, поэтому правки "~/.bashrc" должно хватить.


Для примера мы рассмотрим этот сайт и экспорт страниц. В моём примере работает не всё, сколько бы я не говорил API "не задавать вопросов и сохранять файл", пользователю понадобится нажать одну кнопку. Диалога загрузки.
Для примера мы рассмотрим этот сайт и экспорт страниц.
Использовать я буду Google Chromium и chromium-chromedriver из Ubuntu Linux, как очень распространённые штуки, которые может установить почти каждый. В будущем этот пример стоит переделать, выводя опции наружу функций, запускающих Chromium, или вообще используя один процесс браузера, но пока и так сойдёт. Также мы предполагаем, что загрузка занимает менее 60 секунд.


<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
Строка 18: Строка 19:


from selenium import webdriver
from selenium import webdriver
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.common.exceptions import NoSuchElementException, TimeoutException


Строка 39: Строка 38:
def obtain_page_list(headless=True):
def obtain_page_list(headless=True):
     result = []
     result = []
     opts = Options()
     chrome_options = webdriver.ChromeOptions()
     opts.headless = headless
     # Configure headless Chrome options
     # Disable Selenium browser's cache
    chrome_options.add_argument("--headless")
     profile = webdriver.FirefoxProfile()
    # Wonder if it is needed at all for a headless downloader
     driver = webdriver.Firefox(profile, options=opts)
    chrome_options.add_argument("--window-size=1920x1080")
    chrome_options.add_argument("--disable-notifications")
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--verbose')
     chrome_options.add_argument('--disable-gpu')
     chrome_options.add_argument('--disable-software-rasterizer')
    # Create a Chromedriver instance
     driver = webdriver.Chrome(chrome_options=chrome_options)
     # Launch browser with our url
     # Launch browser with our url
     driver.get(ALL_PAGES_URL)
     driver.get(ALL_PAGES_URL)
Строка 57: Строка 63:


def download_exported_pages(page_names, headless=True):
def download_exported_pages(page_names, headless=True):
     opts = Options()
     chrome_options = webdriver.ChromeOptions()
     opts.headless = headless
 
     # Disable Selenium browser's cache
     # Configure headless Chrome options
     profile = webdriver.FirefoxProfile()
    chrome_options.add_argument("--headless")
    # Wonder if it is needed at all for a headless downloader
    chrome_options.add_argument("--window-size=1920x1080")
    chrome_options.add_argument("--disable-notifications")
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--verbose')
     chrome_options.add_argument('--disable-gpu')
     chrome_options.add_argument('--disable-software-rasterizer')
   
     # Set a save directory
     # Set a save directory
     save_dir = getcwd()
     save_dir = getcwd()
     default_types = "application/xml, attachment/xml, text/xml"
     # default_types = "application/xml, attachment/xml, text/xml"
     profile.set_preference("browser.download.dir", save_dir)
     chrome_options.add_experimental_option("prefs", {
    profile.set_preference("browser.download.folderList", 2)
        "download.default_directory": save_dir,
    profile.set_preference("browser.download.manager.showWhenStarting", False)
        "download.prompt_for_download": False,
    profile.set_preference("browser.download.manager.useWindow", False)
        "download.directory_upgrade": True,
    profile.set_preference("browser.download.manager.focusWhenStarting", False)
        "safebrowsing_for_trusted_sources_enabled": False,
    profile.set_preference("browser.download.manager.showAlertOnComplete", False)
        "safebrowsing.enabled": False
     profile.set_preference("browser.download.manager.closeWhenDone", True)
     })
     profile.set_preference("browser.helperApps.alwaysAsk.force", False)
     # Create a Chromedriver instance
    profile.set_preference("browser.helperApps.neverAsk.saveToDisk", default_types)
     driver = webdriver.Chrome(chrome_options=chrome_options)
     driver = webdriver.Firefox(profile, options=opts)
 
     # Log a save directory
     # Log a save directory
     print('Saving a file to "{}"...'.format(save_dir))
     print('Saving a file to "{}"...'.format(save_dir))
Строка 118: Строка 132:
     main()
     main()
</syntaxhighlight>
</syntaxhighlight>
== Проблемы с кодом ==
Диалог загрузки файла возникает в нормальном режиме и вероятно, появляется у headless-браузера.
Firefox 86.0, [https://github.com/mozilla/geckodriver/releases geckodriver] 0.29.0.
Страница [https://github.com/SeleniumHQ/selenium/issues/new?assignees=&labels=&template=bug.md bug-issue] SeleniumHQ рекомендует приложить демо, которое загружает статьи, но стоит ли кидать демо на эту Вики?..
Также нам сразу рекомендуют обращаться к [https://bugzilla.mozilla.org/buglist.cgi?product=Testing&component=Marionette Mozilla].
Брр, не зря я начал с загрузки файла, этого я обычно не делаю и тут вылезает баг.


[[Категория:Незавершённые страницы]] [[Категория:Методичка]]
[[Категория:Незавершённые страницы]] [[Категория:Методичка]]
Администраторы, Редакторы
684

правки