Есть ли способ загрузки файлов с помощью безголового хроматографа в Centos с использованием Ruby? - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь загрузить файл, используя безголовый хром, и файл, похоже, никуда не загружается.Я мог видеть, что на самом деле это функция безопасности, ограничивающая загрузку файлов в автономном режиме, но есть ли обходной путь для того же в Ruby?Попробовал приведенный ниже код, но не повезло.

download_path = "#{Pathname.pwd}/test-data/downloaded"
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument("--disable-dev-shm-usage");
options.add_argument('--headless') #Declaring the browser to run in headless mode
options.add_preference(
  :download, directory_upgrade: true,
  prompt_for_download: false,
  default_directory: download_path
)
options.add_preference(:browser, set_download_behavior: { behavior: 'allow' })
@driver = Selenium::WebDriver.for :chrome, options: options #Browser object initialization
set_screen_resolution(1400, 900)
$driver = @driver

bridge = @driver.send(:bridge)
path = '/session/:session_id/chromium/send_command'
path[':session_id'] = bridge.session_id
bridge.http.call(:post, path, cmd: 'Page.setDownloadBehavior',
                        params: {
                          behavior: 'allow',
                          downloadPath: download_path
                        })

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

1 Ответ

0 голосов
/ 02 мая 2019

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

def download_file(label, download_path)
  ele = Locator.new(:xpath, "//ul[@class='cnt']//div[text()='#{label}']/..//a")
  download_url = get_attribute(ele.get_how, ele.get_what, "href")
  @driver.execute_script("window.open()")
  @driver.switch_to.window(@driver.window_handles.last)
  bridge = @driver.send(:bridge)
  path = '/session/:session_id/chromium/send_command'
  path[':session_id'] = bridge.session_id
  bridge.http.call(:post, path, {
    "cmd" => 'Page.setDownloadBehavior',
    "params" => {
      "behavior" => 'allow',
      "downloadPath" => download_path
    }
  })
  @driver.get(download_url)
  @driver.close
  @driver.switch_to.window(@driver.window_handles.last)
end
...