Элемент не активируется в режиме без головы - PullRequest
2 голосов
/ 19 января 2020

Мой код очень прост: нажмите на ссылку href, чтобы скачать файл. Он работает нормально, пока я не добавлю аргумент без заголовка, а затем щелчок по нему ничего не даст. Вы не уверены, является ли это проблемой Selenium или Chromedriver? Ни одно из решений, которые я нашел в Интернете, не было полезным, поэтому любые предложения будут оценены. Вот мой код:

import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


class Scraper(object):

    def __init__(self, cursor):
        self.driver = None

    def create_driver(self):
        # Set up Headless Chrome
        chrome_options = Options()
        chrome_options.add_argument("--headless")
        chrome_options.add_argument("--no-sandbox")
        chrome_options.add_argument("--start-maximized")
        chrome_options.add_argument("--window-size=1920x1080")
        self.driver = webdriver.Chrome(executable_path=os.path.abspath("path to chromedriver"),
                                   chrome_options=chrome_options)
        self.driver.maximize_window()

    def go_to_website(self):
        self.driver.get('https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/6202.0Nov%202019?OpenDocument')
        link_to_click = self.driver.find_element_by_xpath("//a[contains(@href,'/log?openagent&6202012.xls&6202.0')]")
        link_to_click.click()

    def run(self):
        # set a new driver
        self.create_driver()
        self.go_to_website()

Ответы [ 2 ]

2 голосов
/ 19 января 2020

Если ваш вариант использования состоит в том, чтобы щелкнуть элемент .xls для элемента с текстом ... Таблица 12. Статус рабочей силы по полу, штату и территории - тренд, с учетом сезонных колебаний и оригинал ... вы можете WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих стратегий локатора :

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#details tbody tr:nth-of-type(13) td>a>img"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//tr[@class='listentry']/td[contains(., 'Labour force status by Sex, State and Territory - Trend, Seasonally adjusted and Original')]//following::td[1]/a/img"))).click()
    
  • Примечание : у вас есть добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Обновление

Однако возможность щелкнуть элемент с помощью Стратегии локатора может не начать загрузку. Чтобы начать загрузку, используя , вам нужно настроить Page.setDownloadBehavior - execute_cdp_cmd(), и вы можете найти подробное обсуждение в Загрузить файл через Google Chrome в режиме без головы

1 голос
/ 19 января 2020

Вы должны указать путь загрузки при использовании безголового режима в chromedriver. Также вам нужно дождаться загрузки файла. В приведенном ниже коде вы можете найти простой пример того, как ждать загрузки файла. Я использовал регулярное выражение, чтобы получить имя файла.

import os

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re

download_path = "your_download_path"

options = webdriver.ChromeOptions()
prefs = {
    "profile.default_content_settings.popups": 0,
    "download.prompt_for_download": False,
    "download.directory_upgrade ": True,
    'download.default_directory': download_path,
}
options.add_experimental_option('prefs', prefs)
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.headless = True
driver = webdriver.Chrome(options=options)

driver.set_window_size(1920, 1080)
driver.maximize_window()

wait = WebDriverWait(driver, 10)

spreadsheet_name = "Table 12. Labour force status by Sex, State and Territory - Trend, Seasonally adjusted and Original"
excel_xpath = f"//tr[contains(., '{spreadsheet_name}') and @class='listentry']//a[./img[contains(@alt, 'Excel')]]"

with driver:
    driver.get('https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/6202.0Nov%202019?OpenDocument')

    download_button = wait.until(EC.element_to_be_clickable((By.XPATH, excel_xpath)))
    href = download_button.get_attribute("href")

    # href of the file
    # https://www.abs.gov.au/ausstats/meisubs.nsf/log?openagent&6202012.xls&6202.0&Time%20Series%20Spreadsheet&053D25DD395DF901CA2584D4001C70A5&0&Nov%202019&19.12.2019&Latest"
    file_name = re.findall(r"(?<=openagent&)(.*?)(?=&)", href)[0]

    download_button.click()

    for i in range(60):
        if not os.path.exists(f"{download_path}/{file_name}"):
            time.sleep(1)

    if not os.path.exists(f"{download_path}/{file_name}"):
        print("Failed to download", file_name, href)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...