Это Ruby Clean и API высокого уровня к хром. По умолчанию запускается без головы, но вы можете настроить его для запуска в головном режиме. Все, что вам нужно, это Ruby и хром или хром. Ferrum подключается к браузеру с помощью протокола CDP, и нет никакой зависимости селена/webdriver/chromedriver. Акцент был сделан на необработанном протоколе CDP, потому что Chrome позволяет вам делать так много вещей, которые едва поддерживаются Webdriver, потому что он должен иметь последовательный дизайн с другими браузерами.
Cuprite - чистый водитель Ruby для капибары на основе Ferrum. Если вы собираетесь ползать на сайтах, вы лучше используете Ferrum или сосуд, потому что вы ползаете, а не тестируете.
Среда ползания высокого уровня суда, основанная на Ferrum и Mechanize.
Там нет официального хромового или хромового пакета для Linux, не устанавливайте его таким образом, потому что он либо устаревший, либо неофициальный, оба плохие. Загрузите его из официального источника для Chrome или Chromium. Хромированный двоичный файл должен быть на PATH или BROWSER_PATH , и вы можете передать его в качестве опции для экземпляра браузера. См :browser_path в настройке.
Добавьте это в свой Gemfile и запустите bundle install .
gem "ferrum" Перейдите на веб -сайт и сохраните скриншот:
browser = Ferrum :: Browser . new
browser . go_to ( "https://google.com" )
browser . screenshot ( path : "google.png" )
browser . quit Когда вы работаете с экземпляром браузера Ferrum создает и поддерживает для вас страницу по умолчанию, на самом деле все приведенные выше методы отправляются в экземпляр page , который создается в default_context экземпляра browser . Вы можете взаимодействовать со страницей, созданной вручную, и это предпочтительнее:
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://google.com" )
input = page . at_xpath ( "//input[@name='q']" )
input . focus . type ( "Ruby headless driver for Chrome" , :Enter )
page . at_css ( "a > h3" ) . text # => "rubycdp/ferrum: Ruby Chrome/Chromium driver - GitHub"
browser . quitОцените немного JavaScript и получите полную ширину/высоту:
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
width , height = page . evaluate <<~JS
[document.documentElement.offsetWidth,
document.documentElement.offsetHeight]
JS
# => [1024, 1931]
browser . quitСделайте любые движения мыши, которые вам нравятся:
# Trace a 100x100 square
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://google.com" )
page . mouse
. move ( x : 0 , y : 0 )
. down
. move ( x : 0 , y : 100 )
. move ( x : 100 , y : 100 )
. move ( x : 100 , y : 0 )
. move ( x : 0 , y : 0 )
. up
browser . quit В Docker как root вы должны передать опцию браузера без сандбоков:
Ferrum :: Browser . new ( browser_options : { 'no-sandbox' : nil } )Также сообщалось, что процесс Chrome неоднократно вылетает при запуске внутри контейнера Docker на MC MAC MAC, предотвращая работу Ferrum. Ferrum должен работать так же, как и ожидалось при развертывании в контейнер Docker на MAC, не являющемся MC.
Вы можете настроить параметры со следующим кодом в настройке теста:
Ferrum :: Browser . new ( options )Hash:headless (String | Boolean) - Установите браузер как без головы или нет, по true . Вы можете установить "new" , чтобы поддержать новый режим без головы.:xvfb (boolean) - Запустите браузер в виртуальном кадре, по false .:flatten (BOOLEAN) - Используйте одно подключение к WebSocket в браузере и все страницы в режиме сглаживания.:window_size (массив) - Размеры окна браузера, в котором можно проверить, выраженное как массив с двумя элементами, например [1024, 768]. По умолчанию: [1024, 768]:extensions (Array [String | hash]) - массив путей к файлам или исходному коду JS, который будет предварительно загружен в браузер, например: ["/path/to/script.js", { source: "window.secret = 'top'" }]:logger (объект, отвечающий на puts ) - Когда настоящий, вывод отладки записывается в этот объект.:slowmo (Integer | float) - установите задержку в секунды, чтобы подождать перед отправкой команды. Полезный компаньон без головы вариант, чтобы у вас было время увидеть изменения.:timeout (числовой) - количество секунд, которые мы ждем ответа при общении с браузером. По умолчанию 5.:js_errors (BOOLEAN) - Когда True, ошибки JavaScript повторно разрабатываются в Ruby.:pending_connection_errors (boolean) - Когда основной кадр все еще ждет медленных ответов, пока достигается PendingConnectionsError -аут. Лучше выяснить, почему у вас медленные ответы и исправлять или блокировать их, а не выключать эту настройку. По умолчанию верно.:browser_name (символ) - :chrome по умолчанию, только экспериментальная поддержка :firefox на данный момент.:browser_path (string) - Путь к бинарному хроме, вы также можете установить переменную env как BROWSER_PATH=some/path/chrome bundle exec rspec .:browser_options (hash)-Дополнительные параметры командной строки, см. их все, например { "ignore-certificate-errors" => nil }:ignore_default_browser_options (boolean) - Ferrum имеет ряд параметров по умолчанию, который он передает в браузер, если вы установите это на true , то только параметры, которые вы вкладываете :browser_options будет передаваться в браузер, за исключением необходимых, конечно.:port (целое число) - порт удаленной отладки для безголовного хрома.:host (String) - адрес удаленной отладки для безголовного Chrome.:url (String) - URL для управляемого экземпляра Chrome. Если это установлено, процесс браузера не будет порожден.:ws_url (String) - URL -адрес websocket для управления экземпляром Chrome. Если это установлено, процесс браузера не будет порожден. Это более высокий приоритет, чем :url , настройка оба не имеет смысла.:process_timeout (Integer) - Как долго ждать, пока процесс Chrome ответит на запуск.:ws_max_receive_size (Integer) - Как большие сообщения принять из Chrome через веб -сокет, в байтах. По умолчанию до 64 МБ. Входящие сообщения больше, чем это, вызовут Ferrum::DeadBrowserError .:proxy (хэш) - указать настройки прокси, читать дальше:save_path (string) - Путь для сохранения вложений с заголовком -дискозией контента.:env (hash) - переменные среды, которые вы хотели бы передать в процесс StringНавигационные страницы до.
String URL. URL должен включать схему, если вы не установите base_url при настройке драйвера. page . go_to ( "https://github.com/" ) Перейдите на предыдущую страницу в истории.
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back Перейдите на следующую страницу в истории.
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back
page . forward Перезагрузить текущую страницу.
page . go_to ( "https://github.com/" )
page . refresh Остановите все навигации и загрузку в ожидании ресурсов на странице
page . go_to ( "https://github.com/" )
page . stop Установите положение для окна браузера
HashIntegerInteger browser . position = { left : 10 , top : 20 } Array<Integer>Получите позицию для окна браузера
browser . position # => [10, 20] Установить границы окон
HashIntegerIntegerIntegerIntegerString browser . window_bounds = { left : 10 , top : 20 , width : 1024 , height : 768 , window_state : "normal" } Hash<String, Integer | String>Получите границы окон
browser . window_bounds # => { "left": 0, "top": 1286, "width": 10, "height": 10, "windowState": "normal" } IntegerТекущий идентификатор окна
browser . window_id # => 1 Node | nil Найдите узел от селектора. Запускает document.querySelector в документе или предоставлен узлом.
StringHashNode | nil page . go_to ( "https://github.com/" )
page . at_css ( "a[aria-label='Issues you created']" ) # => Node Array<Node> | [] Найдите узлы от селектора. Метод запускает document.querySelectorAll в документе или предоставленного узла.
StringHashNode | nil page . go_to ( "https://github.com/" )
page . css ( "a[aria-label='Issues you created']" ) # => [Node] Node | nilНайдите узел от XPath.
StringHashNode | nil page . go_to ( "https://github.com/" )
page . at_xpath ( "//a[@aria-label='Issues you created']" ) # => Node Array<Node> | []Найдите узлы xpath.
StringHashNode | nil page . go_to ( "https://github.com/" )
page . xpath ( "//a[@aria-label='Issues you created']" ) # => [Node] StringВозвращает текущее местоположение верхнего окна Href.
page . go_to ( "https://google.com/" )
page . current_url # => "https://www.google.com/" StringВозвращает текущее название верхнего окна
page . go_to ( "https://google.com/" )
page . current_title # => "Google" StringВозвращает HTML текущей страницы.
page . go_to ( "https://google.com/" )
page . body # => '<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"><head>... String | IntegerСохраняет скриншот на диске или возвращает его в качестве Base64.
HashString пути, чтобы сохранить скриншот на диске. :encoding будет установлено на :binary автоматическиSymbol :base64 | :binary вы можете настроить его, чтобы вернуть изображение как base64String "jpeg" ("jpg") | "Png" | "Webp"Integer 0-100 работает только для JPEGBooleanString селектор CSS для данного элемента, необязательныйHash для экрана, дополнительнаяIntegerIntegerIntegerIntegerFloat Zoom in in/outFerrum::RGBA.new(0, 0, 0, 0.0) , чтобы иметь конкретный цвет фона page . go_to ( "https://google.com/" )
# Save on the disk in PNG
page . screenshot ( path : "google.png" ) # => 134660
# Save on the disk in JPG
page . screenshot ( path : "google.jpg" ) # => 30902
# Save to Base64 the whole page not only viewport and reduce quality
page . screenshot ( full : true , quality : 60 , encoding : :base64 ) # "iVBORw0KGgoAAAANSUhEUgAABAAAAAMACAYAAAC6uhUNAAAAAXNSR0IArs4c6Q...
# Save on the disk with the selected element in PNG
page . screenshot ( path : "google.png" , selector : 'textarea' ) # => 11340
# Save to Base64 with an area of the page in PNG
page . screenshot ( path : "google.png" , area : { x : 0 , y : 0 , width : 400 , height : 300 } ) # => 54239
# Save with specific background color
page . screenshot ( background_color : Ferrum :: RGBA . new ( 0 , 0 , 0 , 0.0 ) ) String | BooleanСохраняет PDF на диске или возвращает его в качестве BASE64.
Hash : String пути, чтобы сохранить PDF на диске. :encoding будет установлено на :binary автоматически
: Кодирование Symbol :base64 | :binary вы можете настроить его, чтобы вернуть PDF в качестве base64
: Ландшафт Boolean бумажной ориентации. По умолчанию ложно.
: масштабировать Float Zoom in in/out
: symbol формата стандартные размеры бумаги: буква ,: законно ,: таблоид ,: ledger ,: a0 ,: a1 ,: a2 ,: a3 ,: a4 ,: a5 ,: a6
: paper_width Float Set Set Paper ширина
: Paper_height Float Set Set Height
Смотрите другие собственные варианты, которые вы можете пройти
page . go_to ( "https://google.com/" )
# Save to disk as a PDF
page . pdf ( path : "google.pdf" , paper_width : 1.0 , paper_height : 1.0 ) # => true String | IntegerСохраняет MHTML на диске или возвращает его в виде строки.
HashString пути для сохранения файла на диске. page . go_to ( "https://google.com/" )
page . mhtml ( path : "google.mhtml" ) # => 87742 page.network
Array<Network::Exchange> Возвращает всю информацию о сетевом трафике в качестве экземпляра Network::Exchange , который в целом является оберткой вокруг request , response и error .
page . go_to ( "https://github.com/" )
page . network . traffic # => [#<Ferrum::Network::Exchange, ...] Network::RequestЗапрос страницы основного кадра.
page . go_to ( "https://github.com/" )
page . network . request # => #<Ferrum::Network::Request... Network::ResponseОтвет страницы основного кадра.
page . go_to ( "https://github.com/" )
page . network . response # => #<Ferrum::Network::Response... Integer Содержит код состояния ответа главной страницы (например, 200 для успеха). Это всего лишь ярлык для response.status .
page . go_to ( "https://github.com/" )
page . network . status # => 200 Boolean В ожидании сетевого холостого хода возвращается true в случае успеха и false , если есть все еще соединения.
HashInteger сколько подключений разрешено, чтобы сеть была на холостом ходу, 0 по умолчаниюFloat сна в течение данного времени и снова проверьте, 0.05 по умолчаниюFloat в какое время мы пытаемся проверить iDle, browser.timeout по умолчанию page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle # => true В ожидании сетевого холостого хода или повышает ошибку Ferrum::TimeoutError . Принимает те же аргументы, что и wait_for_idle .
page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle! # might raise an error Очистить кеш или собранный трафик Пейджа.
Symbol это либо :traffic , либо :cache traffic = page . network . traffic # => []
page . go_to ( "https://github.com/" )
traffic . size # => 51
page . network . clear ( :traffic )
traffic . size # => 0 Установите перехват запроса для заданных параметров. Этот метод только устанавливает перехват запросов, вы должны использовать on вызове, чтобы поймать запросы и прервать или продолжить их.
HashString шаблона * по умолчаниюSymbol один из типов ресурсов browser = Ferrum :: Browser . new
page = browser . create_page
page . network . intercept
page . on ( :request ) do | request |
if request . match? ( /bla-bla/ )
request . abort
elsif request . match? ( /lorem/ )
request . respond ( body : "Lorem ipsum" )
else
request . continue
end
end
page . go_to ( "https://google.com" ) Если сайт или прокси используют авторизацию, вы можете предоставить учетные данные, используя этот метод.
HashSymbol :server | :proxy -сайт или разрешение на проксиStringString пароляrequest.continue . page . network . authorize ( user : "login" , password : "pass" ) { | req | req . continue }
page . go_to ( "http://example.com/authenticated" )
puts page . network . status # => 200
puts page . body # => Welcome, authenticated client Поскольку Chrome реализует авторизацию использования перехвата запроса, вы должны продолжить или прервать уполномоченные запросы. Если у вас уже есть код, который использует перехват, вы можете использовать authorize без блока, но если нет, вы обязаны передавать блок, так что это версия не проходит блок и может работать просто хорошо:
browser = Ferrum :: Browser . new
page = browser . create_page
page . network . intercept
page . on ( :request ) do | request |
if request . resource_type == "Image"
request . abort
else
request . continue
end
end
page . network . authorize ( user : "login" , password : "pass" , type : :proxy )
page . go_to ( "https://google.com" ) Вы использовали метод authorize без блока, но, поскольку он реализован с использованием перехвата запроса, может быть столкновение с другой частью вашего кода, которая также использует перехват запросов, поэтому этот авторизация позволяет запросить, пока ваш код отрицает, но уже слишком поздно. Блок теперь обязательен.
Активирует эмуляцию сетевых условий.
HashBoolean Emulate Emulate Internet Densnection, false по умолчаниюInteger минимальной задержки от запроса, отправленного к полученным заголовкам ответов (MS), 0 по умолчаниюInteger Максимумальная агрегированная пропускная способность (байты/сек), -1 по умолчанию, отключает загрузку дроссельInteger максимальная агрегированная пропускная способность загрузки (байты/сек), -1 по умолчанию, отключает загрузку дроссельString тип соединения, если известно, одно из: none, cellular2g, cellular3g, cellular4g, bluetooth, ethernet, wi -fi, wimax, другие. nil по умолчанию page . network . emulate_network_conditions ( connection_type : "cellular2g" )
page . go_to ( "https://github.com/" ) Активирует автономный режим для страницы.
page . network . offline_mode
page . go_to ( "https://github.com/" ) # => Ferrum::StatusError (Request to https://github.com/ failed(net::ERR_INTERNET_DISCONNECTED)) Boolean )Переключает игнорирование кэша для каждого запроса. Если это правда, кэш не будет использоваться.
page . network . cache ( disable : true ) page.downloads
Array<Hash> Возвращает всю информацию о загруженных файлах как Hash .
page . go_to ( "http://localhost/attachment.pdf" )
page . downloads . files # => [{"frameId"=>"E3316DF1B5383D38F8ADF7485005FDE3", "guid"=>"11a68745-98ac-4d54-9b57-9f9016c268b3", "url"=>"http://localhost/attachment.pdf", "suggestedFilename"=>"attachment.pdf", "totalBytes"=>4911, "receivedBytes"=>4911, "state"=>"completed"}] Ожидает, пока загрузка не будет закончена.
page . go_to ( "http://localhost/attachment.pdf" )
page . downloads . waitили
page . go_to ( "http://localhost/page" )
page . downloads . wait { page . at_css ( "#download" ) . click } Устанавливает поведение в случае загрузки файла.
HashString Absolute Path of Whed, где хранить файлSymbol поведения deny | allow | allowAndName | default , allow по умолчанию page . go_to ( "https://example.com/" )
page . downloads . set_behavior ( save_path : "/tmp" , behavior : :allow ) Вы можете установить прокси с помощью :proxy Option:
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , user : "user" , password : "pa$$" } ) :bypass может указать полуколонинный список хостов, для которых прокси не следует использовать:
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , bypass : "*.google.com;*foo.com" } )В целом, передавая опцию по доверенности, когда создание браузера приводит к тому, что браузер работает с флагами командной строки прокси, чтобы он влиял на все страницы и контексты. Вы можете создать страницу в новом контексте, которая может использовать свои собственные настройки прокси:
browser = Ferrum :: Browser . new
browser . create_page ( proxy : { host : "x.x.x.x" , port : 31337 , user : "user" , password : "password" } ) do | page |
page . go_to ( "https://api.ipify.org?format=json" )
page . body # => "x.x.x.x"
end
browser . create_page ( proxy : { host : "y.y.y.y" , port : 31337 , user : "user" , password : "password" } ) do | page |
page . go_to ( "https://api.ipify.org?format=json" )
page . body # => "y.y.y.y"
end page.mouse
Страница прокрутки до данного x, y
Integer пикселей вдоль горизонтальной оси документа, которое вы хотите отображать в верхнем левомInteger пикселей вдоль вертикальной оси документа, которое вы хотите отображать в левом верхнем левом page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . mouse . scroll_to ( 0 , 400 ) MouseНажмите с данными координат, стреляет мыши, движусь, вниз и вверх события.
HashIntegerIntegerFloat умолчанию по умолчанию.Symbol кнопки: слева | : справа, по умолчанию: слеваInteger по умолчанию до 1Integer Bitfield для ключевых модификаторов. Смотрите keyboard.modifiers MouseМышь внизу для данных координат.
HashSymbol кнопки: слева | : справа, по умолчанию: слеваInteger по умолчанию до 1Integer Bitfield для ключевых модификаторов. Смотрите keyboard.modifiers MouseМыши поднимаются для данных координат.
HashSymbol кнопки: слева | : справа, по умолчанию: слеваInteger по умолчанию до 1Integer Bitfield для ключевых модификаторов. Смотрите keyboard.modifiers MouseМышь переехала на данный х и y.
HashIntegerIntegerInteger по умолчанию в 1. Отправляет промежуточные события MouseMove. page.keyboard
KeyboardОтправляет событие Keydown.
String | Имя Symbol ключа, такого как «a»,: enter,: backspace KeyboardОтправляет событие Keyup.
String | Название Symbol ключа, такого как «B»,: enter,: backspace KeyboardОтправляет событие Keydown, Keypress/Input и Keyup для каждого символа в тексте.
String | Array<String> | Array<Symbol> Текст для ввода в целенаправленный элемент, [:Shift, "s"], "tring" IntegerВозвращает Битфилд для данных ключей
Array<Symbol> : alt | : ctrl | : Команда | :сдвиг page.cookies
Hash<String, Cookie>Возвращает куки -хеш
page . cookies . all # => {"NID"=>#<Ferrum::Cookies::Cookie:0x0000558624b37a40 @attributes={"name"=>"NID", "value"=>"...", "domain"=>".google.com", "path"=>"/", "expires"=>1583211046.575681, "size"=>178, "httpOnly"=>true, "secure"=>false, "session"=>false}>} CookieВозвращает cookie
String значения page . cookies [ "NID" ] # => <Ferrum::Cookies::Cookie:0x0000558624b67a88 @attributes={"name"=>"NID", "value"=>"...", "domain"=>".google.com", "path"=>"/", "expires"=>1583211046.575681, "size"=>178, "httpOnly"=>true, "secure"=>false, "session"=>false}> BooleanУстанавливает печенье
HashStringStringStringIntegerStringBoolean page . cookies . set ( name : "stealth" , value : "omg" , domain : "google.com" ) # => trueCookie nid_cookie = page . cookies [ "NID" ] # => <Ferrum::Cookies::Cookie:0x0000558624b67a88>
page . cookies . set ( nid_cookie ) # => true BooleanУдаляет данный cookie
HashStringStringString page . cookies . remove ( name : "stealth" , domain : "google.com" ) # => true BooleanУдаляет все файлы cookie для текущей страницы
page . cookies . clear # => true BooleanХранит все файлы cookie на текущей странице в файле.
# Cookies are saved into cookies.yml
page . cookies . store # => 15657 BooleanЗагружает все файлы cookie из файла и устанавливает их для текущей страницы.
# Cookies are loaded from cookies.yml
page . cookies . load # => true page.headers
HashПолучите все заголовки
BooleanУстановка заданных заголовков. В конечном итоге очистите все заголовки и установлены.
Hash -клавишные пары, например "User-Agent" => "Browser" BooleanДобавляет заданные заголовки, чтобы уже установить.
Hash -клавишные пары, например "Referer" => "http://example.com" BooleanОчистить все заголовки.
Оценить и возвращать результаты для данного выражения JS
String выражения должна быть допустимой JavaScriptObject ARGS Вы можете передать аргументы, хотя это должен быть допустимый Node или простое значение. page . evaluate ( "[window.scrollX, window.scrollY]" ) Оценить асинхронное выражение и результат возврата
String выражения должна быть допустимой JavaScriptObject ARGS Вы можете передать аргументы, хотя это должен быть допустимый Node или простое значение. page . evaluate_async ( %(arguments[0]({foo: "bar"})) , 5 ) # => { "foo" => "bar" } Выполнить выражение. Не возвращает результат
String выражения должна быть допустимой JavaScriptObject ARGS Вы можете передать аргументы, хотя это должен быть допустимый Node или простое значение. page . execute ( %(1 + 1) ) # => true Оценить JavaScript, чтобы изменить вещи перед загрузкой страницы
String выражения должна быть допустимой JavaScript browser . evaluate_on_new_document <<~JS
Object.defineProperty(navigator, "languages", {
get: function() { return ["tlh"]; }
});
JS BooleanHashStringString путиString контентаString - text/javascript по умолчанию page . add_script_tag ( url : "http://example.com/stylesheet.css" ) # => true BooleanHashStringString путиString контента page . add_style_tag ( content : "h1 { font-size: 40px; }" ) # => true BooleanHashBoolean , true по умолчанию page . bypass_csp # => true
page . go_to ( "https://github.com/ruby-concurrency/concurrent-ruby/blob/master/docs-source/promises.in.md" )
page . refresh
page . add_script_tag ( content : "window.__injected = 42" )
page . evaluate ( "window.__injected" ) # => 42 Отключает Javascripts из загруженного HTML -источника. Вы все еще можете оценить JavaScript с помощью evaluate или execute . Ничего не возвращает.
page . disable_javascript Переопределяет размеры экрана устройства и эмулирует Viewport.
HashInteger , ширина просмотра. 0 по умолчаниюInteger , высота вида. 0 по умолчаниюFloat , коэффициент шкалы устройства. 0 по умолчаниюBoolean , будь то эмуляция мобильного устройства. false по умолчанию page . set_viewport ( width : 1000 , height : 600 , scale_factor : 3 ) Array[Frame] | []Возвращает все кадры текущая страница.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . frames # =>
# [
# #<Ferrum::Frame @id="C6D104CE454A025FBCF22B98DE612B12" @parent_id=nil @name=nil @state=:stopped_loading @execution_id=1>,
# #<Ferrum::Frame @id="C09C4E4404314AAEAE85928EAC109A93" @parent_id="C6D104CE454A025FBCF22B98DE612B12" @state=:stopped_loading @execution_id=2>,
# #<Ferrum::Frame @id="2E9C7F476ED09D87A42F2FEE3C6FBC3C" @parent_id="C6D104CE454A025FBCF22B98DE612B12" @state=:stopped_loading @execution_id=3>,
# ...
# ] FrameВозвращает основную кадр Пейджа, верхнюю часть дерева и родитель всех кадров.
Frame | nilНайдите кадр по данным вариантам.
HashString - идентификатор уникального кадра, который предоставляет браузерString - имя кадра, если есть один page . frame_by ( id : "C6D104CE454A025FBCF22B98DE612B12" ) StringУникальный идентификатор кадры.
String | nilРодительский идентификатор кадра, если этот вложен в другой.
IntegerИдентификатор контекста выполнения, который используется JS, каждый кадр имеет свой собственный контекст, в котором JS оценивает.
String | nilЕсли кадр получил имя, оно должно быть здесь.
Symbol | nilОдно из штатов в рамках:
:started_loading:navigated:stopped_loadingStringВозвращает местоположение текущего кадра Href.
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . url # => https://interactive-examples.mdn.mozilla.net/pages/tabbed/iframe.html Возвращает название текущего кадра.
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . title # => HTML Demo: <iframe> BooleanЕсли текущий кадр является основной кадрой страницы (верхняя часть дерева).
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . main? # => false StringВозвращает местоположение верхнего окна текущего кадра Href.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_url # => "https://www.w3schools.com/tags/tag_frame.asp" StringВозвращает заголовок верхнего окна текущего кадра.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_title # => "HTML frame tag" StringВозвращает HTML текущего кадра.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . body # => "<html><head></head><body></body></html>" Возвращает Doctype текущего кадра.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . main_frame . doctype # => "<!DOCTYPE html>" Устанавливает содержание данного кадра.
String page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . body # <html lang="en"><head><style>body {transition: opacity ease-in 0.2s; }...
frame . content = "<html><head></head><body><p>lol</p></body></html>"
frame . body # => <html><head></head><body><p>lol</p></body></html> Принять диалог с данным текстом или приглашением по умолчанию, если применимо
String Отклонить диалог
page . on ( :dialog ) do | dialog |
if dialog . match? ( /bla-bla/ )
dialog . accept
else
dialog . dismiss
end
end
page . go_to ( "https://google.com" ) Вы можете замедлить или ускорить анимацию CSS.
Integer Возвращает частоту воспроизведения для анимации CSS, по умолчанию до 1 .
Устанавливает уровень воспроизведения анимации CSS
Integer page . playback_rate = 2000
page . go_to ( "https://google.com" )
page . playback_rate # => 2000 Boolean FrameВозвращает объект Frame для текущего узла, вы можете продолжать использовать искатели для этого объекта:
frame = page . at_xpath ( "//iframe" ) . frame # => Frame
frame . at_css ( "//a[text() = 'Log in']" ) # => Node Boolean Array<Node> Node | nil ): Boolean (цепно) выбирает параметры по атрибуту передаваемого.
page . at_xpath ( "//*[select]" ) . select ( [ "1" ] ) # => Node (select)
page . at_xpath ( "//*[select]" ) . select ( [ "text" ] , by : :text ) # => Node (select)Принять строку, массив или струны:
page . at_xpath ( "//*[select]" ) . select ( "1" )
page . at_xpath ( "//*[select]" ) . select ( "1" , "2" )
page . at_xpath ( "//*[select]" ) . select ( [ "1" , "2" ] ) Вы можете использовать tracing.record для создания трассировки, который можно открыть в Chrome Devtools или просмотре времени.
page . tracing . record ( path : "trace.json" ) do
page . go_to ( "https://www.google.com" )
end String Принимает блокировку, записи трассировки и по умолчанию возвращает трассировку данных от Tracing.tracingComplete . Когда указан path возвращает true и хранит трассировки данных в файл.
HashString пути Сохранить данные на диске, nil по умолчаниюSymbol :base64 | :binary вывод кодирования в виде базы64 или простого текста. :binary по умолчаниюFloat , пока потоковая передача файла не завершится в указанное время или не поднимает ошибку, по умолчанию nilBoolean снимки снимка в следах, false по умолчаниюHash<String, Object> Config для трассировки, для категорий см. GetCategories, только одна конфигурация трассировки может быть активной за один раз в браузер. Закрывает вкладки браузера, открытые экземпляром Browser .
# connect to a long-running Chrome process
browser = Ferrum :: Browser . new ( url : 'http://localhost:9222' )
browser . go_to ( "https://github.com/" )
# clean up, lest the tab stays there hanging forever
browser . reset
browser . quit Ferrum полностью защищен. Вы можете создать один браузер или несколько, как вы хотите, и начать играть вокруг, используя потоки. Пример ниже показывает, как создать несколько страниц, которые имеют один и тот же контекст. Контекст похож на профиль инкогнито, но у вас может быть более одного, подумайте об этом, как будто это независимая сессия браузера:
browser = Ferrum :: Browser . new
context = browser . contexts . create
t1 = Thread . new ( context ) do | c |
page = c . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . screenshot ( path : "t1.png" )
end
t2 = Thread . new ( context ) do | c |
page = c . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+static+typing" )
page . screenshot ( path : "t2.png" )
end
t1 . join
t2 . join
context . dispose
browser . quitИли вы можете создать два независимых контекста:
browser = Ferrum :: Browser . new
t1 = Thread . new ( browser ) do | b |
context = b . contexts . create
page = context . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . screenshot ( path : "t1.png" )
context . dispose
end
t2 = Thread . new ( browser ) do | b |
context = b . contexts . create
page = context . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+static+typing" )
page . screenshot ( path : "t2.png" )
context . dispose
end
t1 . join
t2 . join
browser . quit После проверки репо, запустите bundle install для установки зависимостей.
Затем запустите bundle exec rake test для запуска тестов. Вы также можете запустить bin/console для интерактивной подсказки, которая позволит вам экспериментировать.
Чтобы установить этот драгоценный камень на локальную машину, запустите bundle exec rake install . Чтобы bundle exec rake release новую версию, обновите .gem версии в version.rb .
Отчеты об ошибках и запросы на тягу приветствуются на GitHub.
Драгоценный камень доступен в качестве открытого исходного кода в соответствии с условиями лицензии MIT.