Es ist Ruby Clean und hochrangige API für Chrom. Fährt standardmäßig Kopflosen aus, aber Sie können es so konfigurieren, dass es in einem Kopfbringungsmodus ausgeführt wird. Alles, was Sie brauchen, ist Rubin und Chrom oder Chrom. Ferrum verbindet das CDP -Protokoll mit dem Browser und es gibt keine Selen-/Webdriver/Chromedriver -Abhängigkeit. Der Schwerpunkt wurde auf einem RAW -CDP -Protokoll gelegt, da Sie mit Chrome so viele Dinge tun können, die von Webdriver kaum unterstützt werden, da es mit anderen Browsern einheitlich ein konsistentes Design haben sollte.
Cuprite ist ein reiner Ruby -Fahrer für Capybara, der auf Ferrum basiert. Wenn Sie Sites kriechen möchten, verwenden Sie besser Ferrum oder Schiff, weil Sie kriechen, nicht testen.
Schiffe hochrangiger Web-Crawling-Framework auf Basis von Ferrum und Mechanize.
Es gibt kein offizielles Chrom- oder Chrom -Paket für Linux, die es nicht so installieren, da es entweder veraltet oder inoffiziell ist. Beide sind schlecht. Laden Sie es von der offiziellen Quelle für Chrom oder Chrom herunter. Chrome -Binärdatei sollte sich im PATH oder im BROWSER_PATH befinden, und Sie können es als Option zum Browser -Instanz übergeben. Siehe :browser_path in der Anpassung.
Fügen Sie dies zu Ihrer Gemfile hinzu und führen Sie bundle install .
gem "ferrum" Navigieren Sie zu einer Website und speichern Sie einen Screenshot:
browser = Ferrum :: Browser . new
browser . go_to ( "https://google.com" )
browser . screenshot ( path : "google.png" )
browser . quit Wenn Sie mit dem Browser -Instanz -Ferrum arbeiten, erstellt und verwaltet eine Standardseite für Sie, tatsächlich werden alle oben genannten Methoden an die page gesendet, die im default_context der browser erstellt wird. Sie können mit einer manuellen Seite interagieren, und dies wird bevorzugt:
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 . quitBewerten Sie ein JavaScript und erhalten Sie die volle Breite/Höhe:
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 . quitMachen Sie alle Mausbewegungen, die Sie mögen:
# 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 In Docker als Root müssen Sie die Option "No-Sandbox-Browser" übergeben:
Ferrum :: Browser . new ( browser_options : { 'no-sandbox' : nil } )Es wurde auch berichtet, dass der Chromprozess beim Laufen in einem Docker -Container auf einem M1 -Mac wiederholt abstürzt, wodurch Ferrum funktioniert. Ferrum sollte wie erwartet funktionieren, wenn er in einem Docker-Container auf einem Nicht-M1-Mac bereitgestellt wird.
Sie können Optionen mit dem folgenden Code in Ihrem Test -Setup anpassen:
Ferrum :: Browser . new ( options )Hash:headless (String | Boolean) - Setzen Sie den Browser als Kopf und nicht standardmäßig true . Sie können "new" einstellen, um den neuen Kopflosenmodus zu unterstützen.:xvfb (boolean) - Browser in einem virtuellen Framebuffer ausführen, standardmäßig false .:flatten (boolean) - Verwenden Sie eine WebSocket -Verbindung zum Browser und alle Seiten im Abflachmodus.:window_size (array) - Die Abmessungen des Browserfensters, in dem man testet, ausgedrückt als 2 -Element -Array, z. B. [1024, 768]. Standard: [1024, 768]:extensions (Array [String | Hash]) - Ein Array von Pfaden zu Dateien oder JS -Quellcode, der in den Browser eingeladen werden soll ["/path/to/script.js", { source: "window.secret = 'top'" }] z.:logger (Objekt, das auf puts reagiert) - Wenn die Debug -Ausgabe an dieses Objekt vorliegt.:slowmo (Ganzzahl | Float) - Stellen Sie eine Verzögerung in Sekunden ein, um zu warten, bevor Sie den Befehl senden. Nützlicher Begleiter der kopflosen Option, damit Sie Zeit haben, Änderungen zu sehen.:timeout (numerisch) - Die Anzahl der Sekunden, die wir bei der Kommunikation mit Browser auf eine Antwort warten. Standard ist 5.:js_errors (boolean) - Wenn wahr, werden JavaScript -Fehler in Ruby wieder aufgenommen.:pending_connection_errors (boolean) - Wenn der Hauptrahmen immer noch auf langsame Antworten wartet, während die Zeitüberschreitung erreicht wird, wird PendingConnectionsError erhöht. Es ist besser herauszufinden, warum Sie langsame Antworten haben und sie reparieren oder blockieren, anstatt diese Einstellung auszuschalten. Standard ist wahr.:browser_name (symbol) - :chrome standardmäßig, nur experimentelle Unterstützung für :firefox für den Moment.:browser_path (String) - Pfad zu Chrome Binary können Sie auch Env -Variable als BROWSER_PATH=some/path/chrome bundle exec rspec festlegen.:browser_options (Hash)-Zusätzliche Befehlszeilenoptionen, siehe sie alle { "ignore-certificate-errors" => nil }:ignore_default_browser_options (boolean) - Ferrum hat eine Reihe von Standardoptionen, die an den Browser übergeben werden. Wenn Sie dies auf true einstellen, werden nur Optionen, die Sie eingegeben haben :browser_options werden an den Browser übergeben, außer natürlich diejenigen, die Sie natürlich haben.:port (Ganzzahl) - Remote -Debugging -Port für kopfloses Chrom.:host (String) - Remote -Debugging -Adresse für kopfloses Chrom.:url (String) - URL für eine laufende Instanz von Chrom. Wenn dies festgelegt ist, wird ein Browserprozess nicht hervorgebracht.:ws_url (String) - WebSocket -URL für eine laufende Instanz von Chrome. Wenn dies festgelegt ist, wird ein Browserprozess nicht hervorgebracht. Es hat eine höhere Priorität als :url , wenn beide nicht sinnvoll sind.:process_timeout (Integer) - Wie lange muss man darauf warten, dass der Chrome -Prozess beim Start reagiert.:ws_max_receive_size (Ganzzahl) - Wie große Nachrichten in Bytes von Chrome über den Web -Socket akzeptieren. Standardeinstellungen zu 64 MB. Eingehende Nachrichten, die größer als diese sind, verursachen ein Ferrum::DeadBrowserError .:proxy (Hash) - Geben Sie Proxy -Einstellungen an, lesen Sie mehr:save_path (String) - Pfad zum Speichern von Anhängen mit Inhaltsdisposition -Header.:env (Hash) - Umgebungsvariablen, die Sie an den Prozess übergeben möchten StringNavigieren Sie auf der Seite zu.
String Die URL sollte ein Schema enthalten, es sei denn, Sie setzen base_url beim Konfigurieren von Treiber. page . go_to ( "https://github.com/" ) Navigieren Sie zur vorherigen Seite im Verlauf.
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back Navigieren Sie zur nächsten Seite im Verlauf.
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back
page . forward Aktuelle Seite neu laden.
page . go_to ( "https://github.com/" )
page . refresh Stoppen Sie alle Navigationen und laden Sie anhängige Ressourcen auf der Seite
page . go_to ( "https://github.com/" )
page . stop Stellen Sie die Position für das Browserfenster ein
HashIntegerInteger browser . position = { left : 10 , top : 20 } Array<Integer>Holen Sie sich die Position für das Browserfenster
browser . position # => [10, 20] Fenstergrenzen einstellen
HashIntegerIntegerIntegerIntegerString browser . window_bounds = { left : 10 , top : 20 , width : 1024 , height : 768 , window_state : "normal" } Hash<String, Integer | String>Holen Sie sich Fenstergrenzen
browser . window_bounds # => { "left": 0, "top": 1286, "width": 10, "height": 10, "windowState": "normal" } IntegerAktuelle Fenster -ID
browser . window_id # => 1 Node | nil Suchen Sie den Knoten nach Selektor. Führt document.querySelector innerhalb des Dokuments oder dem bereitgestellten Knoten aus.
StringHashNode | nil page . go_to ( "https://github.com/" )
page . at_css ( "a[aria-label='Issues you created']" ) # => Node Array<Node> | [] Finden Sie Knoten nach Selektor. In der Methode wird document.querySelectorAll ausgeführt. QuerySelectorAll im Dokument oder den bereitgestellten Knoten.
StringHashNode | nil page . go_to ( "https://github.com/" )
page . css ( "a[aria-label='Issues you created']" ) # => [Node] Node | nilFinden Sie den Knoten nach XPath.
StringHashNode | nil page . go_to ( "https://github.com/" )
page . at_xpath ( "//a[@aria-label='Issues you created']" ) # => Node Array<Node> | []Finden Sie Knoten von XPath.
StringHashNode | nil page . go_to ( "https://github.com/" )
page . xpath ( "//a[@aria-label='Issues you created']" ) # => [Node] StringGibt den aktuellen oberen Fensterspeicherort HREF zurück.
page . go_to ( "https://google.com/" )
page . current_url # => "https://www.google.com/" StringGibt den aktuellen Top -Fenster -Titel zurück
page . go_to ( "https://google.com/" )
page . current_title # => "Google" StringGibt die HTML der aktuellen Seite zurück.
page . go_to ( "https://google.com/" )
page . body # => '<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"><head>... String | IntegerSpeichert Screenshot auf einer Festplatte oder gibt es als Base64 zurück.
HashString , um einen Screenshot auf der Festplatte zu speichern. :encoding wird festgelegt auf :binary automatischSymbol :base64 | :binary Sie können es so einstellen, dass das Bild als Base64 zurückgibtString "JPEG" ("JPG") | "Png" | "Webp"Integer 0-100 funktioniert nur für JPEGBoolean Egal, ob Sie einen vollseitigen Screenshot oder ein Ansichtsfenster benötigenString CSS -Selektor für bestimmtes Element, optionalHash -Bereich für Screenshot, optionalIntegerIntegerIntegerIntegerFloat zoom ein/outFerrum::RGBA.new(0, 0, 0, 0.0) um eine spezifische Hintergrundfarbe zu haben 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 | BooleanSpeichert PDF auf einer Festplatte oder gibt es als Base64 zurück.
Hash : String , um ein PDF auf der Festplatte zu speichern. :encoding wird festgelegt auf :binary automatisch
: Symbol :base64 | :binary Sie können es so einstellen, dass PDF als Base64 zurückgegeben wird
: Landschaft Boolean Papierorientierung. Standardmäßig falsch.
: skalieren Float zoom ein/out
: Format symbol Standard Papiergrößen: Brief,: legal,: Boulevardzeitung,: Ledger,: A0,: A1 ,: A2 ,: A3 ,: A4 ,: A5 ,: A6
: paper_width Float set Paper Breite
: Paper_Height Float Set Paperhöhe
Siehe andere native Optionen, die Sie verabschieden können
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 | IntegerSpeichert MHTML auf einer Festplatte oder gibt es als Zeichenfolge zurück.
HashString , um eine Datei auf der Festplatte zu speichern. page . go_to ( "https://google.com/" )
page . mhtml ( path : "google.mhtml" ) # => 87742 page.network
Array<Network::Exchange> Gibt alle Informationen über den Netzwerkverkehr als Network::Exchange -Instanz, die im Allgemeinen ein Wrapper in Bezug auf request , response und error ist.
page . go_to ( "https://github.com/" )
page . network . traffic # => [#<Ferrum::Network::Exchange, ...] Network::RequestSeitenanfrage des Hauptrahmens.
page . go_to ( "https://github.com/" )
page . network . request # => #<Ferrum::Network::Request... Network::ResponseSeitenantwort des Hauptrahmens.
page . go_to ( "https://github.com/" )
page . network . response # => #<Ferrum::Network::Response... Integer Enthält den Statuscode der Hauptseitenantwort (z. B. 200 für einen Erfolg). Dies ist nur eine Abkürzung für response.status .
page . go_to ( "https://github.com/" )
page . network . status # => 200 Boolean Warten auf den Leerlauf im Leerlauf, gibt im true von Erfolg und false zurück, wenn noch Verbindungen vorhanden sind.
HashInteger Wie viele Verbindungen dienen, damit das Netzwerk 0 Leerlauf standFloat schlafe für bestimmte Zeit und erneut überprüft, 0.05 standardmäßigFloat Während der Zeit, in der wir versuchen, den Leerlauf zu überprüfen, browser.timeout standardmäßig page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle # => true Warten auf Netzwerk -Leerlauf oder erhöht Ferrum::TimeoutError -Fehler. Akzeptiert die gleichen Argumente wie 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 Löschen Sie den Cache von Page oder gesammelten Verkehr.
Symbol ein, es ist entweder :traffic oder :cache traffic = page . network . traffic # => []
page . go_to ( "https://github.com/" )
traffic . size # => 51
page . network . clear ( :traffic )
traffic . size # => 0 Setzen Sie die Anfrage für bestimmte Optionen. Diese Methode ist nur festgelegt, dass das Anfragestellungsabfang on ist.
HashString * standardmäßigSymbol ressource_type Einer der Ressourcentypen 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" ) Wenn Site oder Proxy die Autorisierung verwendet, können Sie Anmeldeinformationen mit dieser Methode bereitstellen.
HashSymbol :server | :proxy -Site oder Proxy -AutorisierungStringStringrequest.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 Da Chrome implementiert, müssen Sie autorisieren, dass Sie autorisierte Anfragen fortsetzen oder abbrechen müssen. Wenn Sie bereits einen Code haben, der Interception verwendet, können Sie authorize ohne Block verwenden. Wenn Sie jedoch nicht verpflichtet sind, den Block zu übergeben, ist diese Version keinen Block und kann einwandfrei funktionieren:
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" ) Sie haben früher die authorize -Methode ohne Block aufgerufen, aber da sie mithilfe von Anforderungsabhörungen implementiert wurde, kann es zu einer Kollision mit einem anderen Teil Ihres Codes kommen, der auch Anforderungsabhörungen verwendet, sodass Autorize die Anforderung ermöglicht, während Ihr Code leugnet, aber zu spät ist es zu spät. Der Block ist jetzt obligatorisch.
Aktiviert die Emulation von Netzwerkbedingungen.
HashBoolean emulieren die Internet -Trennung, standardmäßig falseInteger Mindestlatenz von Anfrage, die an die Antwort Header empfangen wird (MS), 0 standardmäßigInteger Maximal -1 Download -Durchsatz (Bytes/SekInteger Maximal -1 Upload -Durchsatz (Bytes/SekString -Verbindungstyp, falls bekannt, einer von: None, Cellular2g, Cellular3g, Cellular4g, Bluetooth, Ethernet, WiFi, WiMax, andere. nil standardmäßig page . network . emulate_network_conditions ( connection_type : "cellular2g" )
page . go_to ( "https://github.com/" ) Aktiviert den Offline -Modus für eine Seite.
page . network . offline_mode
page . go_to ( "https://github.com/" ) # => Ferrum::StatusError (Request to https://github.com/ failed(net::ERR_INTERNET_DISCONNECTED)) Boolean )Umschaltet den Cache für jede Anfrage. Wenn wahr, wird Cache nicht verwendet.
page . network . cache ( disable : true ) page.downloads
Array<Hash> Gibt alle Informationen zu heruntergeladenen Dateien als Hash zurück.
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"}] Wartet, bis der Download fertig ist.
page . go_to ( "http://localhost/attachment.pdf" )
page . downloads . waitoder
page . go_to ( "http://localhost/page" )
page . downloads . wait { page . at_css ( "#download" ) . click } Legt das Verhalten im Falle einer Datei herunter, die heruntergeladen werden soll.
HashString Der Absolute Pfad, wo die Datei gespeichert werden sollSymbol deny | allow | allowAndName | default , standardmäßig allow page . go_to ( "https://example.com/" )
page . downloads . set_behavior ( save_path : "/tmp" , behavior : :allow ) Sie können einen Proxy mit einer :proxy -Option festlegen:
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , user : "user" , password : "pa$$" } ) :bypass kann eine halb-kolon-getrennte Liste von Hosts angeben, für die der Proxy nicht verwendet werden sollte:
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , bypass : "*.google.com;*foo.com" } )Im Allgemeinen führt das Bestehen einer Proxy -Option beim Instanziieren eines Browsers zu einem Browser mit Proxy -Befehlszeilenflags, so dass dies alle Seiten und Kontexte betrifft. Sie können eine Seite in einem neuen Kontext erstellen, der seine eigenen Proxy -Einstellungen verwenden kann:
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
Scrollseite zu einem gegebenen x, y
Integer das Pixel entlang der horizontalen Achse des Dokuments, das Sie oben links angezeigt werden sollenInteger das Pixel entlang der vertikalen Achse des Dokuments, das Sie oben links angezeigt werden sollen page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . mouse . scroll_to ( 0 , 400 ) MouseKlicken Sie auf gegebene Koordinaten, feuert die Mausverkehr, nach unten und nach oben.
HashIntegerIntegerFloat standardmäßig auf 0. Verzögerung zwischen Maus nach unten und Mausereignissen auf MausereignisseSymbol : links | : rechts, Standardeinstellungen zu: linksInteger standardmäßig 1Integer Bitfield für wichtige Modifikatoren. Siehe keyboard.modifiers MouseMaus für bestimmte Koordinaten nach unten.
HashSymbol : links | : rechts, Standardeinstellungen zu: linksInteger standardmäßig 1Integer Bitfield für wichtige Modifikatoren. Siehe keyboard.modifiers MouseMaus für bestimmte Koordinaten.
HashSymbol : links | : rechts, Standardeinstellungen zu: linksInteger standardmäßig 1Integer Bitfield für wichtige Modifikatoren. Siehe keyboard.modifiers MouseMaus bewegen sich zu gegebener x und y.
HashIntegerIntegerInteger standardmäßig 1. Sendet intermediate Mousemove -Ereignisse. page.keyboard
KeyboardVersendet ein Keydown -Ereignis.
String | Symbol der Schlüssel wie "a",: eingeben,: Rückraum KeyboardVersendet ein Schlüsselereignis.
String | Symbol der Schlüssel wie "B",: ENTERN,: Backpace KeyboardSendet für jedes Zeichen im Text einen Keydown-, TastePress/ - und Taste -Ereignis.
String | Array<String> | Array<Symbol> Ein Text, der in ein fokussiertes Element eingeben kann, [:Shift, "s"], "tring" IntegerGibt Bitfield für einen bestimmten Schlüssel zurück
Array<Symbol> : Alt | : Strg | : Befehl | :Schicht page.cookies
Hash<String, Cookie>Gibt Cookies Hash zurück
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}>} CookieGibt Cookie zurück
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}> BooleanSetzt einen Keks
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 BooleanEntfernt gegebenes Keks
HashStringStringString page . cookies . remove ( name : "stealth" , domain : "google.com" ) # => true BooleanEntfernt alle Cookies für die aktuelle Seite
page . cookies . clear # => true BooleanSpeichert alle Cookies der aktuellen Seite in einer Datei.
# Cookies are saved into cookies.yml
page . cookies . store # => 15657 BooleanLaden Sie alle Cookies aus der Datei und legt sie für die aktuelle Seite fest.
# Cookies are loaded from cookies.yml
page . cookies . load # => true page.headers
HashHolen Sie sich alle Header
BooleanGeben Sie gegebene Header ein. Löschen Sie schließlich alle Header und setzen Sie die angegebenen.
Hash -Schlüssel-Wert-Paare zum Beispiel "User-Agent" => "Browser" BooleanFügt hinzugefügte Header zu den bereits festgelegten Headern.
Hash -Schlüssel-Wert-Paare zum Beispiel "Referer" => "http://example.com" BooleanAlle Header löschen.
Bewerten und Rückgabeergebnisse für den gegebenen JS -Ausdruck
String sollte gültig sein JavaScriptObject Sie können Argumente übergeben, obwohl es sich um einen gültigen Node oder ein einfacher Wert handelt. page . evaluate ( "[window.scrollX, window.scrollY]" ) Bewerten Sie den asynchronen Ausdruck und Rückgabeergebnis
String sollte gültig sein JavaScriptObject Sie können Argumente übergeben, obwohl es sich um einen gültigen Node oder ein einfacher Wert handelt. page . evaluate_async ( %(arguments[0]({foo: "bar"})) , 5 ) # => { "foo" => "bar" } Ausdruck ausführen. Gibt das Ergebnis nicht zurück
String sollte gültig sein JavaScriptObject Sie können Argumente übergeben, obwohl es sich um einen gültigen Node oder ein einfacher Wert handelt. page . execute ( %(1 + 1) ) # => true Bewerten Sie JavaScript, um Dinge vor einem Seitenladen zu ändern
String sollte gültig sein JavaScript browser . evaluate_on_new_document <<~JS
Object.defineProperty(navigator, "languages", {
get: function() { return ["tlh"]; }
});
JS BooleanHashStringStringStringString - text/javascript page . add_script_tag ( url : "http://example.com/stylesheet.css" ) # => true BooleanHashStringStringString page . add_style_tag ( content : "h1 { font-size: 40px; }" ) # => true BooleanHashBoolean , standardmäßig 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 Deaktiviert JavaScripts aus der geladenen HTML -Quelle. Sie können JavaScript weiterhin mit evaluate oder execute bewerten. Gibt nichts zurück.
page . disable_javascript Überschreiben Sie die Abmessungen des Gerätsbildschirms und emuliert das Ansichtsfenster.
HashInteger , Ansichtsfenster. 0 standardmäßigInteger , Ansichtsfenster. 0 standardmäßigFloat , Geräteskala -Faktor. 0 standardmäßigBoolean , ob mobile Geräte nachahmen. standardmäßig false page . set_viewport ( width : 1000 , height : 600 , scale_factor : 3 ) Array[Frame] | []Gibt alle aktuellen Rahmenseite zurück.
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>,
# ...
# ] FrameGibt den Hauptrahmen der Seite zurück, die Oberseite des Baumes und die Eltern aller Rahmen.
Frame | nilFinden Sie einen Rahmen nach bestimmten Optionen.
HashString - Eindeutige ID des Browsers für eindeutige FrameString - Name des Frame, wenn es einen gibt page . frame_by ( id : "C6D104CE454A025FBCF22B98DE612B12" ) StringDie eindeutige ID des Rahmens.
String | nilElternrahmen -ID, wenn dieser in einem anderen verschachtelt ist.
IntegerAusführungskontext -ID, die von JS verwendet wird, hat jeder Frame seinen eigenen Kontext, in dem JS ausgewertet wird.
String | nilWenn der Rahmen einen Namen erhielt, sollte er hier sein.
Symbol | nilEiner der Staaten ist in:
:started_loading:navigated:stopped_loadingStringGibt den Standort des aktuellen Rahmens HREF zurück.
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 Gibt den Titel des aktuellen Frame zurück.
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . title # => HTML Demo: <iframe> BooleanWenn der aktuelle Rahmen der Hauptrahmen der Seite ist (oben am Baum).
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . main? # => false StringGibt den oberen Fensterspeicherort des aktuellen Rahmens HREF zurück.
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" StringGibt den Top -Fenster -Titel des aktuellen Frame zurück.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_title # => "HTML frame tag" StringGibt die HTML des aktuellen Frame zurück.
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>" Gibt den docType des aktuellen Frame zurück.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . main_frame . doctype # => "<!DOCTYPE html>" Legt einen Inhalt eines bestimmten Rahmens fest.
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> Akzeptieren Sie gegebenenfalls Dialog mit gegebenem Text oder Standardeingabeaufforderung
String Dialog entlassen
page . on ( :dialog ) do | dialog |
if dialog . match? ( /bla-bla/ )
dialog . accept
else
dialog . dismiss
end
end
page . go_to ( "https://google.com" ) Sie können CSS -Animationen verlangsamen oder beschleunigen.
Integer Gibt die Wiedergabetrate für CSS -Animationen zurück, standardmäßig 1 .
Legt die Wiedergaberate von CSS -Animationen fest
Integer page . playback_rate = 2000
page . go_to ( "https://google.com" )
page . playback_rate # => 2000 Boolean FrameGibt das Rahmenobjekt für den aktuellen Knoten zurück. Sie können Finder für dieses Objekt weiterhin verwenden:
frame = page . at_xpath ( "//iframe" ) . frame # => Frame
frame . at_css ( "//a[text() = 'Log in']" ) # => Node Boolean Array<Node> Node | nil ): Boolean (kettenfähig) Wählt Optionen nach übergebenem Attribut aus.
page . at_xpath ( "//*[select]" ) . select ( [ "1" ] ) # => Node (select)
page . at_xpath ( "//*[select]" ) . select ( [ "text" ] , by : :text ) # => Node (select)Akzeptieren Sie Zeichenfolge, Array oder Zeichenfolgen:
page . at_xpath ( "//*[select]" ) . select ( "1" )
page . at_xpath ( "//*[select]" ) . select ( "1" , "2" )
page . at_xpath ( "//*[select]" ) . select ( [ "1" , "2" ] ) Sie können tracing.record verwenden, um eine Trace -Datei zu erstellen, die in Chrome Devtools oder Timeline Viewer geöffnet werden kann.
page . tracing . record ( path : "trace.json" ) do
page . go_to ( "https://www.google.com" )
end String Akzeptiert Block, zeichnet TRACE auf und gibt standardmäßig Trace -Daten von Tracing.tracingComplete -Ereignis als Ausgabe zurück. Wenn path angegeben wird, gibt die true zurück und speichert Trace -Daten in Datei.
HashString speichern Sie Daten auf der Festplatte, nil standardmäßig NILSymbol :base64 | :binary Enkodusausgabe als Basis64 oder einfacher Text. :binary standardmäßigFloat Warten Sie, bis das Streaming der Datei in der angegebenen Zeit abgeschlossen ist oder Fehler erhöhen, standardmäßig an nilBoolean Capture Screenshots in der Spur, standardmäßig falseHash<String, Object> Konfiguration für Trace. Für Kategorien siehe GetCategories kann jeweils nur eine Trace -Konfiguration pro Browser aktiv sein. Schließt die von der Browser -Instanz geöffneten Browser -Registerkarten.
# 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 ist vollständig fadensicher. Sie können einen Browser oder einige, wie Sie möchten, erstellen und mit Threads herumspielen. Beispiel unten zeigt, wie Sie einige Seiten erstellen, die den gleichen Kontext teilen. Der Kontext ähnelt einem Inkognito -Profil, aber Sie können mehr als eines haben. Stellen Sie sich das so vor, als wäre es eine unabhängige Browser -Sitzung:
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 . quitOder Sie können zwei unabhängige Kontexte erstellen:
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 Führen Sie nach dem Auschecken des Repo bundle install , um Abhängigkeiten zu installieren.
Führen Sie dann bundle exec rake test aus, um die Tests auszuführen. Sie können auch bin/console für eine interaktive Eingabeaufforderung ausführen, mit der Sie experimentieren können.
Um dieses Juwel auf Ihrem lokalen Computer zu installieren, führen Sie bundle exec rake install aus. Um eine neue Version zu veröffentlichen, aktualisieren Sie die Versionsnummer in version.rb und führen Sie bundle exec rake release aus, die ein Git -Tag für die Version erstellt, Git Commits und das erstellte Tag drücken und die .gem -Datei auf Rubygemems.org überschreiten.
Fehlerberichte und Zuganfragen sind auf GitHub willkommen.
Das Edelstein ist unter den Bedingungen der MIT -Lizenz als Open Source erhältlich.