C'est une API Ruby propre et de haut niveau à Chrome. S'exécute sans tête par défaut, mais vous pouvez le configurer pour exécuter en mode frontal. Tout ce dont vous avez besoin est Ruby et Chrome ou Chromium. Ferrum se connecte au navigateur par le protocole CDP et il n'y a pas de dépendance sélénium / webdriver / chromedriver. L'accent a été mis sur un protocole CDP brut parce que Chrome vous permet de faire tant de choses qui sont à peine prises en charge par WebDriver car elle devrait avoir une conception cohérente avec d'autres navigateurs.
Cuprite est un pilote de rubis pur pour Capybara basé sur Ferrum. Si vous allez ramper, vous utilisez mieux le ferrum ou le navire parce que vous rampez, pas tester.
Framework Web de haut niveau du navire basé sur Ferrum et mécaniser.
Il n'y a pas de package de chrome ou de chrome officiel pour Linux ne l'installe pas de cette façon car il est dépassé ou non officiel, les deux sont mauvais. Téléchargez-le depuis la source officielle de Chrome ou de Chromium. Chrome Binary doit être dans le PATH ou BROWSER_PATH et vous pouvez le transmettre en option pour instance du navigateur voir :browser_path dans la personnalisation.
Ajoutez ceci à votre installation Gemfile et exécutez bundle install .
gem "ferrum" Accédez à un site Web et enregistrez une capture d'écran:
browser = Ferrum :: Browser . new
browser . go_to ( "https://google.com" )
browser . screenshot ( path : "google.png" )
browser . quit Lorsque vous travaillez avec l'instance de navigateur, Ferrum crée et maintient une page par défaut pour vous, en fait toutes les méthodes ci-dessus sont envoyées à l'instance page créée dans le default_context de l'instance browser . Vous pouvez interagir avec une page créée manuellement et cela est préféré:
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Évaluez un JavaScript et obtenez la pleine largeur / hauteur:
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 . quitFaites des mouvements de souris que vous aimez:
# 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 Dans Docker en tant que racine, vous devez passer l'option de navigateur sans sandbox:
Ferrum :: Browser . new ( browser_options : { 'no-sandbox' : nil } )Il a également été signalé que le processus Chrome s'écrase à plusieurs reprises lorsqu'il s'exécute à l'intérieur d'un conteneur Docker sur un M1 Mac empêchant le ferrum de fonctionner. Ferrum doit fonctionner comme prévu lorsqu'il est déployé dans un conteneur Docker sur un Mac non M1.
Vous pouvez personnaliser les options avec le code suivant dans votre configuration de test:
Ferrum :: Browser . new ( options )Hash:headless (String | Boolean) - Définissez le navigateur comme sans tête ou non, true par défaut. Vous pouvez définir "new" pour prendre en charge un nouveau mode sans tête.:xvfb (boolean) - Exécutez le navigateur dans un framebuffer virtuel, false par défaut.:flatten (booléen) - Utilisez une connexion WebSocket au navigateur et toutes les pages en mode aplati.:window_size (Array) - Les dimensions de la fenêtre du navigateur dans lesquelles tester, exprimé en tableau à 2 éléments, par exemple [1024, 768]. Par défaut: [1024, 768]:extensions (Array [String | Hash]) - Un tableau de chemins de chemins vers les fichiers ou le code source JS à précharger dans le navigateur, par exemple: ["/path/to/script.js", { source: "window.secret = 'top'" }]:logger (objet répondant aux puts ) - Lorsqu'il est présent, la sortie de débogage est écrite à cet objet.:slowmo (entier | float) - Définissez un retard en secondes pour attendre avant d'envoyer la commande. Compagnon utile de l'option sans tête, afin que vous ayez le temps de voir des changements.:timeout (numérique) - Le nombre de secondes, nous attendrons une réponse lors de la communication avec le navigateur. La valeur par défaut est 5.:js_errors (booléen) - Lorsque cela est vrai, les erreurs JavaScript sont réévaluées dans Ruby.:pending_connection_errors (booléen) - Lorsque le cadre principal attend toujours des réponses lentes pendant que le délai d'attente est atteint en PendingConnectionsError . Il est préférable de comprendre pourquoi vous avez des réponses lentes et de les corriger ou de les bloquer plutôt que de désactiver cet décor. La valeur par défaut est vraie.:browser_name (symbole) - :chrome par défaut, seulement le support expérimental pour :firefox pour l'instant.:browser_path (String) - Path to Chrome Binary, vous pouvez également définir la variable Env comme BROWSER_PATH=some/path/chrome bundle exec rspec .:browser_options (Hash) - Options de ligne de commande supplémentaires, voyez-les, par exemple { "ignore-certificate-errors" => nil }:ignore_default_browser_options (booléen) - Ferrum a un certain nombre d'options par défaut qu'elle transmet au navigateur, si vous définissez ceci sur true alors seules les options que vous mettez :browser_options sera transmise au navigateur, sauf celles requises bien sûr.:port (entier) - Port de débogage à distance pour Chrome sans tête.:host (String) - Adresse de débogage à distance pour Chrome sans tête.:url (String) - URL pour une instance en cours d'exécution de Chrome. Si cela est défini, un processus de navigateur ne sera pas engendré.:ws_url (String) - URL WebSocket pour une instance en cours d'exécution de Chrome. Si cela est défini, un processus de navigateur ne sera pas engendré. C'est une priorité plus élevée que :url , définir les deux n'a pas de sens.:process_timeout (entier) - Combien de temps pour attendre que le processus Chrome réponde au démarrage.:ws_max_receive_size (entier) - Comment les gros messages accepter à partir de Chrome sur la prise Web, en octets. Par défaut à 64 Mo. Des messages entrants plus grands que cela provoquera un Ferrum::DeadBrowserError .:proxy (Hash) - Spécifiez les paramètres de proxy, Lire la suite:save_path (String) - Path pour enregistrer les pièces jointes avec l'en-tête de contenu-disposition.:env (hachage) - Variables d'environnement que vous aimeriez passer au processus StringNaviguer dans la page vers.
String d'URL L'URL doit inclure le schéma à moins que vous ne définissiez base_url lors de la configuration du pilote. page . go_to ( "https://github.com/" ) Accédez à la page précédente de l'histoire.
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back Accédez à la page suivante de l'histoire.
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back
page . forward Recharger la page actuelle.
page . go_to ( "https://github.com/" )
page . refresh Arrêtez toutes les navigations et chargez des ressources en attente sur la page
page . go_to ( "https://github.com/" )
page . stop Définissez la position de la fenêtre du navigateur
HashInteger gaucheInteger supérieur browser . position = { left : 10 , top : 20 } Array<Integer>Obtenez la position de la fenêtre du navigateur
browser . position # => [10, 20] Définir les limites de la fenêtre
HashInteger gaucheInteger supérieurInteger largeurInteger de hauteurString Window_state browser . window_bounds = { left : 10 , top : 20 , width : 1024 , height : 768 , window_state : "normal" } Hash<String, Integer | String>Obtenez des limites de fenêtre
browser . window_bounds # => { "left": 0, "top": 1286, "width": 10, "height": 10, "windowState": "normal" } IntegerID de fenêtre actuel
browser . window_id # => 1 Node | nil Trouvez le nœud par sélecteur. Exécute document.querySelector dans le document ou le nœud fourni.
String sélecteurHashNode | nil page . go_to ( "https://github.com/" )
page . at_css ( "a[aria-label='Issues you created']" ) # => Node Array<Node> | [] Trouvez des nœuds par sélecteur. La méthode exécute document.querySelectorAll dans le document ou le nœud fourni.
String sélecteurHashNode | nil page . go_to ( "https://github.com/" )
page . css ( "a[aria-label='Issues you created']" ) # => [Node] Node | nilTrouvez le nœud par xpath.
String sélecteurHashNode | nil page . go_to ( "https://github.com/" )
page . at_xpath ( "//a[@aria-label='Issues you created']" ) # => Node Array<Node> | []Trouvez des nœuds par xpath.
String sélecteurHashNode | nil page . go_to ( "https://github.com/" )
page . xpath ( "//a[@aria-label='Issues you created']" ) # => [Node] StringRenvoie l'emplacement actuel de la fenêtre supérieure href.
page . go_to ( "https://google.com/" )
page . current_url # => "https://www.google.com/" StringRenvoie le titre de fenêtre supérieur actuel
page . go_to ( "https://google.com/" )
page . current_title # => "Google" StringRenvoie le HTML actuel de la page.
page . go_to ( "https://google.com/" )
page . body # => '<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"><head>... String | IntegerEnregistre la capture d'écran sur un disque ou le renvoie sous forme de base64.
HashString pour enregistrer une capture d'écran sur le disque. :encoding sera défini sur :binary automatiquementSymbol d'encodage :base64 | :binary vous pouvez le définir sur l'image de retour sous forme de base64String "JPEG" ("JPG") | "png" | "webp"Integer 0-100 fonctionne pour JPEG uniquementBoolean complet, que vous ayez besoin d'une capture d'écran pleine page ou d'une fenêtreString CSS Sélecteur pour élément donné, facultatifHash de zone pour la capture d'écran, facultativeIntegerIntegerInteger largeurInteger de hauteurFloat zoom dans / outFerrum::RGBA.new(0, 0, 0, 0.0) pour avoir une couleur d'arrière-plan spécifique 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 | BooleanEnregistre PDF sur un disque ou le renvoie sous le nom de Base64.
Hash : Path String Pour enregistrer un PDF sur le disque. :encoding sera défini sur :binary automatiquement
: Symbol d'encodage :base64 | :binary Vous pouvez le définir pour retourner PDF en tant que base64
: Orientation de papier Boolean paysage. Par défaut est faux.
: l'échelle Float zoom dans / out
: Format symbol Tailles de papier standard: Lettre ,: Legal ,: Tabloïd ,: Ledger ,: a0 ,: a1 ,: a2 ,: a3 ,: a4 ,: a5 ,: a6
: Paper_width Float Set Paper Largeur
: Paper_Height Float Set Paper Hauteur
Voir d'autres options natives que vous pouvez passer
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 | IntegerEnregistre MHTML sur un disque ou le renvoie sous forme de chaîne.
HashString Pour enregistrer un fichier sur le disque. page . go_to ( "https://google.com/" )
page . mhtml ( path : "google.mhtml" ) # => 87742 page.network
Array<Network::Exchange> Renvoie toutes les informations sur le trafic réseau en tant que Network::Exchange Instance qui, en général, est un wrapper autour request , response et error .
page . go_to ( "https://github.com/" )
page . network . traffic # => [#<Ferrum::Network::Exchange, ...] Network::RequestDemande de page du cadre principal.
page . go_to ( "https://github.com/" )
page . network . request # => #<Ferrum::Network::Request... Network::ResponseRéponse de la page du cadre principal.
page . go_to ( "https://github.com/" )
page . network . response # => #<Ferrum::Network::Response... Integer Contient le code d'état de la réponse de la page principale (par exemple 200 pour un succès). Ce n'est qu'un raccourci pour response.status .
page . go_to ( "https://github.com/" )
page . network . status # => 200 Boolean Attend le réseau du réseau, renvoie true en cas de succès et false s'il y a encore des connexions.
HashInteger combien de connexions sont autorisées pour que le réseau soit au ralenti, 0 par défautFloat Sleep pendant une durée donnée et vérifiez à nouveau, 0.05 par défautFloat pendant quelle heure nous essayons de vérifier le ralenti, browser.timeout par défaut page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle # => true Attend le réseau inactif ou augmente l'erreur Ferrum::TimeoutError . Accepte les mêmes arguments que 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 Effacer le cache de la page ou le trafic collecté.
Symbol c'est soit :traffic ou :cache traffic = page . network . traffic # => []
page . go_to ( "https://github.com/" )
traffic . size # => 51
page . network . clear ( :traffic )
traffic . size # => 0 Définissez l'interception de demande pour les options données. Cette méthode ne fait que définir l'interception des demandes, vous devez utiliser on le rappel pour attraper les demandes et les abandonner ou les continuer.
HashString de modèle * par défautSymbol Resource_Type l'un des types de ressources 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" ) Si le site ou le proxy utilise l'autorisation, vous pouvez fournir des informations d'identification en utilisant cette méthode.
HashSymbol de type :server | :proxy ou proxyString d'utilisateursString de mot de passerequest.continue . 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 Étant donné que Chrome implémente autorise à l'aide de l'interception de la demande, vous devez continuer ou abandonner les demandes autorisées. Si vous avez déjà du code qui utilise l'interception, vous pouvez utiliser authorize sans bloc, mais sinon, vous êtes obligé de passer un bloc, c'est donc la version ne passe pas et peut fonctionner très bien:
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" ) Vous avez l'habitude d'appeler authorize Method Without Block, mais comme il est implémenté en utilisant l'interception de la demande, il pourrait y avoir une collision avec une autre partie de votre code qui utilise également l'interception de la demande, de sorte que l'autorisation autorise la demande tandis que votre code le refuse, mais il est trop tard. Le bloc est obligatoire maintenant.
Active l'émulation des conditions du réseau.
HashBoolean hors ligne imiter la déconnexion Internet, false par défautInteger la latence minimale de la demande envoyée aux en-têtes de réponse reçus (ms), 0 par défautInteger maximal de débit de téléchargement agrégé (octets / sec), -1 par défaut, désactive le téléchargementInteger maximal de débit de téléchargement agrégé (octets / sec), -1 par défaut, désactive le téléchargement de la limitationString Type de connexion Si connu, un de: Aucun, Cellular2g, Cellular3G, Cellular4g, Bluetooth, Ethernet, WiFi, WiMax, autre. nil par défaut page . network . emulate_network_conditions ( connection_type : "cellular2g" )
page . go_to ( "https://github.com/" ) Active le mode hors ligne pour une page.
page . network . offline_mode
page . go_to ( "https://github.com/" ) # => Ferrum::StatusError (Request to https://github.com/ failed(net::ERR_INTERNET_DISCONNECTED)) Boolean )Bascule le cache pour chaque demande. Si c'est vrai, le cache ne sera pas utilisé.
page . network . cache ( disable : true ) page.downloads
Array<Hash> Renvoie toutes les informations sur les fichiers téléchargés sous forme de 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"}] Attend jusqu'à ce que le téléchargement soit terminé.
page . go_to ( "http://localhost/attachment.pdf" )
page . downloads . waitou
page . go_to ( "http://localhost/page" )
page . downloads . wait { page . at_css ( "#download" ) . click } Définit le comportement en cas de fichier à télécharger.
HashString Absolut chemin de où stocker le fichierSymbol de comportement deny | allow | allowAndName | default , allow par défaut page . go_to ( "https://example.com/" )
page . downloads . set_behavior ( save_path : "/tmp" , behavior : :allow ) Vous pouvez définir un proxy avec une option :proxy :
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , user : "user" , password : "pa$$" } ) :bypass peut spécifier la liste des hôtes séparés en semi-colon pour lesquels le proxy ne doit pas être utilisé:
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , bypass : "*.google.com;*foo.com" } )En général, passer une option proxy lorsque l'instanciation d'un navigateur se traduit par un navigateur en cours d'exécution avec des indicateurs de ligne de commande proxy, de sorte qu'il affecte toutes les pages et les contextes. Vous pouvez créer une page dans un nouveau contexte qui peut utiliser ses propres paramètres de proxy:
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
Page de défilement vers un x, y donné
Integer le pixel le long de l'axe horizontal du document que vous souhaitez afficher en haut à gaucheInteger le pixel le long de l'axe vertical du document que vous souhaitez afficher en haut à gauche page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . mouse . scroll_to ( 0 , 400 ) MouseCliquez sur les coordonnées données, tire les événements de déplacement de la souris, de bas et de hausse.
HashIntegerIntegerFloat par défaut à 0. Délai entre les événements de la souris et de la sourisSymbol du bouton: gauche | : à droite, par défaut: gaucheInteger défaut à 1Integer Bitfield pour les modificateurs clés. Voir keyboard.modifiers MouseSouris vers le bas pour les coordonnées données.
HashSymbol du bouton: gauche | : à droite, par défaut: gaucheInteger défaut à 1Integer Bitfield pour les modificateurs clés. Voir keyboard.modifiers MouseSouris pour les coordonnées données.
HashSymbol du bouton: gauche | : à droite, par défaut: gaucheInteger défaut à 1Integer Bitfield pour les modificateurs clés. Voir keyboard.modifiers MouseLa souris se déplace vers X et Y.
HashIntegerIntegerInteger par défaut 1. Envoie des événements intermédiaires de mousmove. page.keyboard
KeyboardEnvoie un événement Keydown.
String clé | Nom du Symbol de la clé telle que "A" ,: Entrée ,: Backspace KeyboardEnvoie un événement KETYUP.
String clé | Nom du Symbol de la clé telle que "B" ,: Entrée ,: Backspace KeyboardEnvoie un événement Keydown, Keypress / entrée et KEYUP pour chaque caractère du texte.
String de texte | Array<String> | Array<Symbol> Un texte pour taper dans un élément focalisé, [:Shift, "s"], "tring" IntegerRenvoie Bitfield pour une clé donnée
Array<Symbol> : Alt | : Ctrl | : commande | :changement page.cookies
Hash<String, Cookie>Retourne le hachage des cookies
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}>} CookieRenvoie le cookie
String valeur 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}> BooleanDéfinit un cookie
Hash de valeurString nomsString de valeurString domaineIntegerString samesiteBoolean page . cookies . set ( name : "stealth" , value : "omg" , domain : "google.com" ) # => trueCookie de valeur nid_cookie = page . cookies [ "NID" ] # => <Ferrum::Cookies::Cookie:0x0000558624b67a88>
page . cookies . set ( nid_cookie ) # => true BooleanSupprime un cookie donné
HashString nomsString domaineString URL page . cookies . remove ( name : "stealth" , domain : "google.com" ) # => true BooleanSupprime tous les cookies pour la page actuelle
page . cookies . clear # => true BooleanStocke tous les cookies de la page actuelle dans un fichier.
# Cookies are saved into cookies.yml
page . cookies . store # => 15657 BooleanCharge tous les cookies du fichier et les définit pour la page actuelle.
# Cookies are loaded from cookies.yml
page . cookies . load # => true page.headers
HashObtenez tous les en-têtes
BooleanDéfinissez des en-têtes donnés. Finalement, effacez tous les en-têtes et définissez-vous.
Hash par exemple "User-Agent" => "Browser" BooleanAjoute des en-têtes donnés à déjà en définir.
Hash par exemple "Referer" => "http://example.com" BooleanEffacer tous les en-têtes.
Évaluer et retourner le résultat pour l'expression de JS donnée
String d'expression doit être valide javascriptObject Vous pouvez passer des arguments, bien qu'il devrait être un Node valide ou une valeur simple. page . evaluate ( "[window.scrollX, window.scrollY]" ) Évaluer l'expression asynchrone et le résultat de retour
String d'expression doit être valide javascriptObject Vous pouvez passer des arguments, bien qu'il devrait être un Node valide ou une valeur simple. page . evaluate_async ( %(arguments[0]({foo: "bar"})) , 5 ) # => { "foo" => "bar" } Exécuter l'expression. Ne renvoie pas le résultat
String d'expression doit être valide javascriptObject Vous pouvez passer des arguments, bien qu'il devrait être un Node valide ou une valeur simple. page . execute ( %(1 + 1) ) # => true Évaluez JavaScript pour modifier les choses avant un chargement de page
String d'expression doit être valide javascript browser . evaluate_on_new_document <<~JS
Object.defineProperty(navigator, "languages", {
get: function() { return ["tlh"]; }
});
JS BooleanHashString URLString cheminString contenuString - text/javascript par défaut page . add_script_tag ( url : "http://example.com/stylesheet.css" ) # => true BooleanHashString URLString cheminString contenu page . add_style_tag ( content : "h1 { font-size: 40px; }" ) # => true BooleanHashBoolean , true par défaut 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 Désactive les javascripts de la source HTML chargée. Vous pouvez toujours évaluer JavaScript avec evaluate ou execute . Ne retourne rien.
page . disable_javascript Remplace les dimensions de l'écran du périphérique et émule la fenêtre.
HashInteger , largeur de la fenêtre. 0 par défautInteger de hauteur, hauteur de la fenêtre. 0 par défautFloat , facteur d'échelle de périphérique. 0 par défautBoolean , s'il faut imiter l'appareil mobile. false par défaut page . set_viewport ( width : 1000 , height : 600 , scale_factor : 3 ) Array[Frame] | []Renvoie toutes les cadres que la page actuelle a.
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>,
# ...
# ] FrameRenvoie le cadre principal de la page, le haut de l'arbre et le parent de toutes les cadres.
Frame | nilTrouvez le cadre par des options données.
HashString - ID de trame unique que le navigateur fournitString - Nom de Frame s'il y en a un page . frame_by ( id : "C6D104CE454A025FBCF22B98DE612B12" ) StringID unique du cadre.
String | nilID de trame parent si celui-ci est imbriqué dans un autre.
IntegerID de contexte d'exécution qui est utilisé par JS, chaque trame a son propre contexte dans lequel JS évalue.
String | nilSi le cadre a reçu un nom, il devrait être là.
Symbol | nilL'un des États du cadre dans:
:started_loading:navigated:stopped_loadingStringRenvoie l'emplacement du cadre actuel 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 Renvoie le titre du cadre actuel.
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . title # => HTML Demo: <iframe> BooleanSi le cadre actuel est le cadre principal de la page (haut de l'arborescence).
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . main? # => false StringRenvoie l'emplacement de la fenêtre supérieure du cadre actuel 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" StringRenvoie le titre de fenêtre supérieur du cadre actuel.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_title # => "HTML frame tag" StringRenvoie le HTML du cadre actuel.
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>" Renvoie le doctype du cadre actuel.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . main_frame . doctype # => "<!DOCTYPE html>" Définit un contenu d'un cadre donné.
String html 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> Acceptez la boîte de dialogue avec un texte donné ou une invite par défaut si vous êtes applicable
String de texte Rejeter le dialogue
page . on ( :dialog ) do | dialog |
if dialog . match? ( /bla-bla/ )
dialog . accept
else
dialog . dismiss
end
end
page . go_to ( "https://google.com" ) Vous pouvez ralentir ou accélérer les animations CSS.
Integer Renvoie le taux de lecture pour les animations CSS, par défaut 1 .
Définit le taux de lecture des animations CSS
Integer de valeur page . playback_rate = 2000
page . go_to ( "https://google.com" )
page . playback_rate # => 2000 Boolean FrameRenvoie un objet trame pour le nœud actuel, vous pouvez continuer à utiliser Finders pour cet objet:
frame = page . at_xpath ( "//iframe" ) . frame # => Frame
frame . at_css ( "//a[text() = 'Log in']" ) # => Node Boolean Array<Node> Node | nil ): Boolean (Chainable) Sélectionne les options par attribut passé.
page . at_xpath ( "//*[select]" ) . select ( [ "1" ] ) # => Node (select)
page . at_xpath ( "//*[select]" ) . select ( [ "text" ] , by : :text ) # => Node (select)Acceptez la chaîne, le tableau ou les chaînes:
page . at_xpath ( "//*[select]" ) . select ( "1" )
page . at_xpath ( "//*[select]" ) . select ( "1" , "2" )
page . at_xpath ( "//*[select]" ) . select ( [ "1" , "2" ] ) Vous pouvez utiliser tracing.record pour créer un fichier de trace qui peut être ouvert dans Chrome Devtools ou Timeline Viewer.
page . tracing . record ( path : "trace.json" ) do
page . go_to ( "https://www.google.com" )
end String Accepte le bloc, les enregistrements tracent et par défaut renvoie les données de trace de l'événement Tracing.tracingComplete en tant que sortie. Lorsque path est spécifié, renvoie true et stocke trace les données dans le fichier.
HashString Enregistrer les données sur le disque, nil par défautSymbol d'encodage :base64 | :binary sortit en tant que base64 ou texte brut. :binary par défautFloat attend que le streaming de fichiers se termine dans l'erreur de temps ou de relance spécifié, par nilBoolean Capture Captures d'écran dans la trace, false par défautHash<String, Object> config for Trace, pour les catégories voir getCategories, une seule configuration de trace peut être active à la fois par navigateur. Ferme les onglets du navigateur ouvert par l'instance 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 est entièrement en file d'attente. Vous pouvez créer un navigateur ou quelques-uns comme vous le souhaitez et commencer à jouer à l'aide de fils. L'exemple ci-dessous montre comment créer quelques pages qui partagent le même contexte. Le contexte est similaire à un profil incognito, mais vous pouvez en avoir plus d'un, pensez-y comme si c'était une session de navigateur indépendante:
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 . quitOu vous pouvez créer deux contextes indépendants:
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 Après avoir vérifié le dépôt, exécutez bundle install pour installer des dépendances.
Ensuite, exécutez bundle exec rake test pour exécuter les tests. Vous pouvez également exécuter bin/console pour une invite interactive qui vous permettra d'expérimenter.
Pour installer ce gemme sur votre machine locale, exécutez bundle exec rake install . Pour publier une nouvelle version, mettez à jour le numéro de version dans version.rb , puis exécutez bundle exec rake release , qui créera une balise GIT pour la version, pousse Git Commits et la balise créée, et poussez le fichier .gem sur RubyGems.org.
Les rapports de bogues et les demandes de traction sont les bienvenus sur GitHub.
Le GEM est disponible en open source en vertu des termes de la licence du MIT.