Ruby bersih dan API tingkat tinggi ke Chrome. Berjalan tanpa kepala secara default, tetapi Anda dapat mengonfigurasinya untuk berjalan dalam mode yang sangat kuat. Yang Anda butuhkan hanyalah ruby dan krom atau kromium. Ferrum terhubung ke browser dengan protokol CDP dan tidak ada ketergantungan selenium/webdriver/chromedriver. Penekanan dilakukan pada protokol CDP mentah karena Chrome memungkinkan Anda untuk melakukan banyak hal yang nyaris tidak didukung oleh WebDriver karena harus memiliki desain yang konsisten dengan browser lain.
Cuprite adalah pengemudi ruby murni untuk capybara berdasarkan ferrum. Jika Anda akan merangkak situs, Anda lebih baik menggunakan ferrum atau kapal karena Anda merangkak, bukan tes.
Kerangka kerja perayapan web tingkat tinggi berdasarkan ferrum dan mekanis.
Tidak ada paket Chrome atau Chromium resmi untuk Linux tidak menginstalnya dengan cara ini karena sudah ketinggalan zaman atau tidak resmi, keduanya buruk. Unduh dari sumber resmi untuk Chrome atau Chromium. Chrome Binary harus ada di PATH atau BROWSER_PATH dan Anda dapat meneruskannya sebagai opsi untuk browser instance Lihat :browser_path dalam kustomisasi.
Tambahkan ini ke Gemfile Anda dan jalankan bundle install .
gem "ferrum" Arahkan ke situs web dan simpan tangkapan layar:
browser = Ferrum :: Browser . new
browser . go_to ( "https://google.com" )
browser . screenshot ( path : "google.png" )
browser . quit Saat Anda bekerja dengan ferrum instance browser membuat dan memelihara halaman default untuk Anda, bahkan semua metode di atas dikirim ke instance page yang dibuat di default_context dari instance browser . Anda dapat berinteraksi dengan halaman yang dibuat secara manual dan ini lebih disukai:
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 . quitEvaluasi beberapa JavaScript dan dapatkan lebar/tinggi penuh:
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 . quitLakukan gerakan mouse yang Anda sukai:
# 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 Di Docker sebagai root Anda harus lulus opsi browser no-sandbox:
Ferrum :: Browser . new ( browser_options : { 'no-sandbox' : nil } )Juga telah dilaporkan bahwa proses chrome berulang kali macet saat berjalan di dalam wadah Docker pada Mac M1 yang mencegah ferrum bekerja. Ferrum harus bekerja seperti yang diharapkan saat digunakan ke wadah Docker pada Mac non-M1.
Anda dapat menyesuaikan opsi dengan kode berikut dalam pengaturan tes Anda:
Ferrum :: Browser . new ( options )Hash Opsi:headless (string | boolean) - atur browser sebagai headless atau tidak, true secara default. Anda dapat mengatur "new" untuk mendukung mode headless baru.:xvfb (boolean) - Jalankan browser di virtual framebuffer, false secara default.:flatten (Boolean) - Gunakan satu koneksi WebSocket ke browser dan semua halaman dalam mode Flatten.:window_size (array) - Dimensi jendela browser untuk diuji, dinyatakan sebagai array 2 -elemen, misalnya [1024, 768]. Default: [1024, 768]:extensions ["/path/to/script.js", { source: "window.secret = 'top'" }]:logger (Objek Menanggapi puts ) - Saat ada, output debug ditulis untuk objek ini.:slowmo (integer | float) - Tetapkan penundaan dalam detik untuk menunggu sebelum mengirim perintah. Teman yang berguna dari opsi tanpa kepala, sehingga Anda punya waktu untuk melihat perubahan.:timeout (numerik) - Jumlah detik kami akan menunggu tanggapan saat berkomunikasi dengan browser. Default adalah 5.:js_errors (boolean) - Ketika benar, kesalahan JavaScript didapat kembali di Ruby.:pending_connection_errors (boolean) - Ketika bingkai utama masih menunggu respons lambat saat timeout tercapai PendingConnectionsError dinaikkan. Lebih baik mencari tahu mengapa Anda memiliki respons yang lambat dan memperbaiki atau memblokirnya daripada mematikan pengaturan ini. Default itu benar.:browser_name (simbol) - :chrome secara default, hanya dukungan eksperimental untuk :firefox untuk saat ini.:browser_path (String) - Path to Chrome Binary, Anda juga dapat mengatur variabel env sebagai BROWSER_PATH=some/path/chrome bundle exec rspec .:browser_options (hash)-opsi baris perintah tambahan, lihat semuanya misalnya { "ignore-certificate-errors" => nil }:ignore_default_browser_options (boolean) - Ferrum memiliki sejumlah opsi default yang diteruskan ke browser, jika Anda mengatur ini ke true maka hanya opsi yang Anda masukkan :browser_options akan diteruskan ke browser, kecuali yang diperlukan tentu saja.:port (integer) - port debugging jarak jauh untuk chrome tanpa kepala.:host (string) - Alamat debugging jarak jauh untuk chrome tanpa kepala.:url (string) - url untuk instance running chrome. Jika ini ditetapkan, proses browser tidak akan diteluskan.:ws_url (String) - URL WebSocket untuk instance Chrome yang sedang berjalan. Jika ini ditetapkan, proses browser tidak akan diteluskan. Ini prioritas yang lebih tinggi dari :url , pengaturan keduanya tidak masuk akal.:process_timeout (integer) - berapa lama menunggu proses chrome merespons saat startup.:ws_max_receive_size (integer) - Seberapa besar pesan untuk diterima dari Chrome di atas soket web, dalam byte. Default ke 64MB. Pesan yang masuk lebih besar dari ini akan menyebabkan Ferrum::DeadBrowserError .:proxy (hash) - Tentukan pengaturan proxy, baca lebih lanjut:save_path (string) - Path untuk menyimpan lampiran dengan header konten -disposisi.:env (hash) - variabel lingkungan yang ingin Anda lewati ke proses StringMenavigasi halaman ke.
String URL harus menyertakan skema kecuali Anda mengatur base_url saat mengkonfigurasi driver. page . go_to ( "https://github.com/" ) Arahkan ke halaman sebelumnya dalam sejarah.
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back Arahkan ke halaman berikutnya dalam sejarah.
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back
page . forward Muat Ulang Halaman Saat Ini.
page . go_to ( "https://github.com/" )
page . refresh Hentikan semua navigasi dan memuat sumber daya yang tertunda di halaman
page . go_to ( "https://github.com/" )
page . stop Atur posisi untuk jendela browser
Hash OpsiInteger kiriInteger browser . position = { left : 10 , top : 20 } Array<Integer>Dapatkan posisi untuk jendela browser
browser . position # => [10, 20] Atur batas jendela
Hash OpsiInteger kiriIntegerInteger LebarInteger tinggiString window_state browser . window_bounds = { left : 10 , top : 20 , width : 1024 , height : 768 , window_state : "normal" } Hash<String, Integer | String>Dapatkan batas jendela
browser . window_bounds # => { "left": 0, "top": 1286, "width": 10, "height": 10, "windowState": "normal" } IntegerID jendela saat ini
browser . window_id # => 1 Node | nil Temukan Node oleh Selector. Menjalankan document.querySelector .
String pemilihHash OpsiNode | nil page . go_to ( "https://github.com/" )
page . at_css ( "a[aria-label='Issues you created']" ) # => Node Array<Node> | [] Temukan node oleh pemilih. Metode ini menjalankan document.querySelectorAll di dalam dokumen atau disediakan node.
String pemilihHash OpsiNode | nil page . go_to ( "https://github.com/" )
page . css ( "a[aria-label='Issues you created']" ) # => [Node] Node | nilTemukan Node oleh XPath.
String pemilihHash OpsiNode | nil page . go_to ( "https://github.com/" )
page . at_xpath ( "//a[@aria-label='Issues you created']" ) # => Node Array<Node> | []Temukan node oleh XPath.
String pemilihHash OpsiNode | nil page . go_to ( "https://github.com/" )
page . xpath ( "//a[@aria-label='Issues you created']" ) # => [Node] StringMengembalikan Lokasi Jendela Top saat ini HREF.
page . go_to ( "https://google.com/" )
page . current_url # => "https://www.google.com/" StringMengembalikan judul jendela atas saat ini
page . go_to ( "https://google.com/" )
page . current_title # => "Google" StringMengembalikan HTML halaman saat ini.
page . go_to ( "https://google.com/" )
page . body # => '<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"><head>... String | IntegerMenghemat tangkapan layar pada disk atau mengembalikannya sebagai base64.
Hash OpsiString untuk menyimpan tangkapan layar pada disk. :encoding akan diatur ke :binary secara otomatisSymbol Pengkodean :base64 | :binary Anda dapat mengaturnya untuk mengembalikan gambar sebagai base64String "jpeg" ("jpg") | "png" | "Webp"Integer 0-100 hanya berfungsi untuk jpegBoolean penuh apakah Anda memerlukan tangkapan layar halaman penuh atau viewportString css untuk elemen yang diberikan, opsionalHash area untuk tangkapan layar, opsionalIntegerIntegerInteger LebarInteger tinggiFloat float masuk/keluarFerrum::RGBA.new(0, 0, 0, 0.0) Untuk memiliki warna latar belakang tertentu 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 | BooleanMenyimpan PDF pada disk atau mengembalikannya sebagai base64.
Hash Opsi : Path String untuk menyimpan PDF pada disk. :encoding akan diatur ke :binary secara otomatis
: Symbol Pengkodean :base64 | :binary Anda dapat mengaturnya untuk mengembalikan PDF sebagai base64
: orientasi kertas Boolean lansekap. Default ke false.
: skala Float float masuk/keluar
: format symbol ukuran kertas standar: huruf ,: legal ,: tabloid ,: ledger ,: a0 ,: a1 ,: a2 ,: a3 ,: a4 ,: a5 ,: a6
: paper_width Float set lebar kertas
: paper_height Float set tinggi kertas
Lihat opsi asli lainnya yang bisa Anda lewati
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 | IntegerMenyimpan MHTML pada disk atau mengembalikannya sebagai string.
Hash OpsiString untuk menyimpan file di disk. page . go_to ( "https://google.com/" )
page . mhtml ( path : "google.mhtml" ) # => 87742 page.network
Array<Network::Exchange> Mengembalikan semua informasi tentang lalu lintas jaringan sebagai Network::Exchange instance yang secara umum merupakan pembungkus di sekitar request , response , dan error .
page . go_to ( "https://github.com/" )
page . network . traffic # => [#<Ferrum::Network::Exchange, ...] Network::RequestPermintaan halaman dari bingkai utama.
page . go_to ( "https://github.com/" )
page . network . request # => #<Ferrum::Network::Request... Network::ResponseRespons halaman dari bingkai utama.
page . go_to ( "https://github.com/" )
page . network . response # => #<Ferrum::Network::Response... Integer Berisi kode status respons halaman utama (misalnya, 200 untuk sukses). Ini hanya jalan pintas untuk response.status .
page . go_to ( "https://github.com/" )
page . network . status # => 200 Boolean Menunggu Network Idle, Returns true jika berhasil dan false jika masih ada koneksi.
Hash OpsiInteger berapa banyak koneksi yang diizinkan untuk menganggur, 0 secara defaultFloat tidur untuk jumlah waktu tertentu dan periksa lagi, 0.05 secara defaultFloat selama jam berapa kami mencoba memeriksa idle, browser.timeout secara default page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle # => true Menunggu Network Idle atau Raises Ferrum::TimeoutError Error. Menerima argumen yang sama dengan 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 Hapus cache halaman atau lalu lintas yang dikumpulkan.
Symbol itu adalah :traffic atau :cache traffic = page . network . traffic # => []
page . go_to ( "https://github.com/" )
traffic . size # => 51
page . network . clear ( :traffic )
traffic . size # => 0 Tetapkan Interception Permintaan untuk opsi yang diberikan. Metode ini hanya set permintaan intersepsi, Anda harus menggunakan on untuk menangkap permintaan dan membatalkan atau melanjutkannya.
Hash OpsiString * secara defaultSymbol sumber daya_type salah satu jenis sumber daya 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" ) Jika situs atau proxy menggunakan otorisasi, Anda dapat memberikan kredensial menggunakan metode ini.
Hash OpsiSymbol :server | :proxy atau otorisasi proxyString penggunaString Kata Sandirequest.continue saja. 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 Karena Chrome mengimplementasikan otorisasi menggunakan intersepsi permintaan, Anda harus melanjutkan atau membatalkan permintaan resmi. Jika Anda sudah memiliki kode yang menggunakan intersepsi, Anda dapat menggunakan authorize tanpa blok, tetapi jika tidak, Anda berkewajiban untuk lulus blok, jadi ini adalah versi tidak lulus blok dan dapat bekerja dengan baik:
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" ) Anda biasa memanggil metode authorize tanpa blok, tetapi karena diterapkan menggunakan intersepsi permintaan mungkin ada tabrakan dengan bagian lain dari kode Anda yang juga menggunakan intersepsi permintaan, sehingga otorisasi memungkinkan permintaan sementara kode Anda menyangkal tetapi sudah terlambat. Blok ini wajib sekarang.
Mengaktifkan emulasi kondisi jaringan.
Hash OpsiBoolean meniru pemutusan internet, false secara defaultInteger latensi minimum dari permintaan yang dikirim ke header respons yang diterima (MS), 0 secara defaultInteger maximal agregated download throughput (bytes/detik), -1 secara default, menonaktifkan throttling unduhInteger maximal agregated unggah throughput (bytes/detik), -1 secara default, menonaktifkan unduhan throttlingString jika diketahui, salah satu dari: tidak ada, selular2g, cellular3g, cellular4g, bluetooth, ethernet, wifi, wiMax, lainnya. nil secara default page . network . emulate_network_conditions ( connection_type : "cellular2g" )
page . go_to ( "https://github.com/" ) Mengaktifkan mode offline untuk halaman.
page . network . offline_mode
page . go_to ( "https://github.com/" ) # => Ferrum::StatusError (Request to https://github.com/ failed(net::ERR_INTERNET_DISCONNECTED)) Boolean )Mengalihkan cache untuk setiap permintaan. Jika benar, cache tidak akan digunakan.
page . network . cache ( disable : true ) page.downloads
Array<Hash> Mengembalikan semua informasi tentang file yang diunduh sebagai 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"}] Menunggu sampai unduhan selesai.
page . go_to ( "http://localhost/attachment.pdf" )
page . downloads . waitatau
page . go_to ( "http://localhost/page" )
page . downloads . wait { page . at_css ( "#download" ) . click } Menetapkan perilaku jika ada file yang akan diunduh.
Hash OpsiString path absolute tempat menyimpan fileSymbol perilaku deny | allow | allowAndName | default , allow secara default page . go_to ( "https://example.com/" )
page . downloads . set_behavior ( save_path : "/tmp" , behavior : :allow ) Anda dapat mengatur proxy dengan opsi :proxy :
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , user : "user" , password : "pa$$" } ) :bypass dapat menentukan daftar host yang dipisahkan semi-kolon yang proxy tidak boleh digunakan:
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , bypass : "*.google.com;*foo.com" } )Secara umum melewati opsi proxy saat instantiasi browser menghasilkan browser yang berjalan dengan bendera baris perintah proxy, sehingga mempengaruhi semua halaman dan konteks. Anda dapat membuat halaman dalam konteks baru yang dapat menggunakan pengaturan proxy sendiri:
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
Halaman gulir ke x, y yang diberikan
Integer Pixel di sepanjang sumbu horizontal dari dokumen yang ingin Anda ditampilkan di kiri atasInteger piksel di sepanjang sumbu vertikal dokumen yang ingin Anda ditampilkan di kiri atas page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . mouse . scroll_to ( 0 , 400 ) MouseKlik Koordinat yang Diberikan, Fires Mouse Moving, Down and Up Events.
Hash OpsiIntegerIntegerFloat Defaults ke 0. Penundaan Antara Mouse Down dan Mouse Up AcaraSymbol : Kiri | : kanan, default ke: kiriInteger ke 1Integer untuk pengubah utama. Lihat keyboard.modifiers MouseTikus ke bawah untuk koordinat yang diberikan.
Hash OpsiSymbol : Kiri | : kanan, default ke: kiriInteger ke 1Integer untuk pengubah utama. Lihat keyboard.modifiers MouseTikus untuk koordinat yang diberikan.
Hash OpsiSymbol : Kiri | : kanan, default ke: kiriInteger ke 1Integer untuk pengubah utama. Lihat keyboard.modifiers MouseTikus pindah ke diberikan x dan y.
Hash OpsiIntegerIntegerInteger ke 1. Mengirim Acara Mousemove Menengah. page.keyboard
KeyboardMengirimkan acara Keydown.
String kunci | Nama Symbol kunci seperti "a",: enter ,: backspace KeyboardMengirimkan acara Keyup.
String kunci | Nama Symbol kunci seperti "b" ,: enter ,: backspace KeyboardMengirimkan keydown, keypress/input, dan acara keyup untuk setiap karakter dalam teks.
String teks | Array<String> | Array<Symbol> teks untuk mengetik ke dalam elemen yang terfokus, [:Shift, "s"], "tring" IntegerMengembalikan bitfield untuk kunci yang diberikan
Array<Symbol> : Alt | : ctrl | : perintah | :menggeser page.cookies
Hash<String, Cookie>Mengembalikan cookie hash
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}>} CookieMengembalikan cookie
String nilai 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}> BooleanMengatur cookie
HashStringStringString domainIntegerString samesiteBoolean 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 BooleanMenghapus cookie yang diberikan
Hash OpsiStringString domainString URL page . cookies . remove ( name : "stealth" , domain : "google.com" ) # => true BooleanMenghapus semua cookie untuk halaman saat ini
page . cookies . clear # => true BooleanMenyimpan semua cookie halaman saat ini dalam sebuah file.
# Cookies are saved into cookies.yml
page . cookies . store # => 15657 BooleanMemuat semua cookie dari file dan mengaturnya untuk halaman saat ini.
# Cookies are loaded from cookies.yml
page . cookies . load # => true page.headers
HashDapatkan semua header
BooleanAtur header yang diberikan. Akhirnya membersihkan semua header dan mengatur yang diberikan.
Hash pair nilai kunci misalnya "User-Agent" => "Browser" BooleanMenambahkan header yang diberikan untuk mengatur yang sudah.
Hash -value pair misalnya "Referer" => "http://example.com" BooleanBersihkan semua header.
Mengevaluasi dan mengembalikan hasil untuk ekspresi JS yang diberikan
String ekspresi harus valid javascriptObject Args Anda dapat lulus argumen, meskipun harus berupa Node yang valid atau nilai sederhana. page . evaluate ( "[window.scrollX, window.scrollY]" ) Mengevaluasi ekspresi asinkron dan hasil pengembalian
String ekspresi harus valid javascriptObject Args Anda dapat lulus argumen, meskipun harus berupa Node yang valid atau nilai sederhana. page . evaluate_async ( %(arguments[0]({foo: "bar"})) , 5 ) # => { "foo" => "bar" } Jalankan ekspresi. Tidak mengembalikan hasilnya
String ekspresi harus valid javascriptObject Args Anda dapat lulus argumen, meskipun harus berupa Node yang valid atau nilai sederhana. page . execute ( %(1 + 1) ) # => true Evaluasi JavaScript untuk memodifikasi hal -hal sebelum pemuatan halaman
String ekspresi harus valid javascript browser . evaluate_on_new_document <<~JS
Object.defineProperty(navigator, "languages", {
get: function() { return ["tlh"]; }
});
JS BooleanHash OpsiString URLString pathString kontenString - text/javascript secara default page . add_script_tag ( url : "http://example.com/stylesheet.css" ) # => true BooleanHash OpsiString URLString pathString konten page . add_style_tag ( content : "h1 { font-size: 40px; }" ) # => true BooleanHash OpsiBoolean , true secara default 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 Menonaktifkan JavaScripts dari sumber HTML yang dimuat. Anda masih dapat mengevaluasi JavaScript dengan evaluate atau execute . Tidak mengembalikan apa pun.
page . disable_javascript Menimpa dimensi layar perangkat dan meniru viewport.
Hash OpsiInteger , Viewport Width. 0 secara defaultInteger tinggi, tinggi viewport. 0 secara defaultFloat scale_factor, faktor skala perangkat. 0 secara defaultBoolean , apakah akan meniru perangkat seluler. false secara default page . set_viewport ( width : 1000 , height : 600 , scale_factor : 3 ) Array[Frame] | []Mengembalikan semua bingkai yang dimiliki halaman saat ini.
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>,
# ...
# ] FrameMengembalikan bingkai utama halaman, bagian atas pohon dan induk dari semua bingkai.
Frame | nilTemukan bingkai dengan opsi yang diberikan.
Hash OpsiString - ID bingkai unik yang disediakan browserString - nama bingkai jika ada satu page . frame_by ( id : "C6D104CE454A025FBCF22B98DE612B12" ) StringID unik bingkai.
String | nilID bingkai induk jika yang satu ini bersarang di yang lain.
IntegerID konteks eksekusi yang digunakan oleh JS, setiap bingkai memiliki konteksnya sendiri di mana JS mengevaluasi.
String | nilJika bingkai diberi nama itu seharusnya ada di sini.
Symbol | nilSalah satu bingkai negara bagian di:
:started_loading:navigated:stopped_loadingStringMengembalikan lokasi bingkai saat ini.
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 Mengembalikan judul bingkai saat ini.
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . title # => HTML Demo: <iframe> BooleanJika bingkai saat ini adalah bingkai utama halaman (atas pohon).
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . main? # => false StringMengembalikan Lokasi Jendela Top Frame saat ini 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" StringMengembalikan judul jendela atas bingkai saat ini.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_title # => "HTML frame tag" StringMengembalikan html bingkai saat ini.
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>" Mengembalikan Doctype Frame saat ini.
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . main_frame . doctype # => "<!DOCTYPE html>" Menetapkan konten dari bingkai yang diberikan.
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> Terima dialog dengan teks atau prompt default yang diberikan jika berlaku
String teks Singkirkan dialog
page . on ( :dialog ) do | dialog |
if dialog . match? ( /bla-bla/ )
dialog . accept
else
dialog . dismiss
end
end
page . go_to ( "https://google.com" ) Anda dapat memperlambat atau mempercepat animasi CSS.
Integer Mengembalikan tingkat pemutaran untuk animasi CSS, default ke 1 .
Menetapkan Tingkat Pemutaran Animasi CSS
Integer page . playback_rate = 2000
page . go_to ( "https://google.com" )
page . playback_rate # => 2000 Boolean FrameMengembalikan objek bingkai untuk node saat ini, Anda dapat terus menggunakan pencari untuk objek itu:
frame = page . at_xpath ( "//iframe" ) . frame # => Frame
frame . at_css ( "//a[text() = 'Log in']" ) # => Node Boolean Array<Node> Node | nil ): Boolean (rantai) Memilih opsi dengan atribut lulus.
page . at_xpath ( "//*[select]" ) . select ( [ "1" ] ) # => Node (select)
page . at_xpath ( "//*[select]" ) . select ( [ "text" ] , by : :text ) # => Node (select)Terima string, array atau string:
page . at_xpath ( "//*[select]" ) . select ( "1" )
page . at_xpath ( "//*[select]" ) . select ( "1" , "2" )
page . at_xpath ( "//*[select]" ) . select ( [ "1" , "2" ] ) Anda dapat menggunakan tracing.record untuk membuat file jejak yang dapat dibuka di Chrome DevTools atau Timeline Viewer.
page . tracing . record ( path : "trace.json" ) do
page . go_to ( "https://www.google.com" )
end String Menerima blok, catatan jejak dan secara default mengembalikan data jejak dari Tracing.tracingComplete peristiwa sebagai output. Ketika path ditentukan pengembalian true dan menyimpan data jejak ke dalam file.
Hash OpsiString Simpan data pada disk, nil secara defaultSymbol Pengkodean :base64 | :binary sebagai base64 atau teks biasa. :binary secara defaultFloat tunggu sampai file streaming selesai dalam waktu yang ditentukan atau naik kesalahan, default ke nilBoolean di jejak, false secara defaultHash<String, Object> config for trace, untuk kategori lihat getCategories, hanya satu konfigurasi jejak yang dapat aktif pada waktu per browser. Menutup tab browser yang dibuka oleh 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 sepenuhnya aman utas. Anda dapat membuat satu browser atau beberapa seperti yang Anda inginkan dan mulai bermain -main menggunakan utas. Contoh di bawah ini menunjukkan cara membuat beberapa halaman yang memiliki konteks yang sama. Konteks mirip dengan profil penyamaran tetapi Anda dapat memiliki lebih dari satu, pikirkan seperti itu sesi browser independen:
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 . quitAtau Anda dapat membuat dua konteks independen:
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 Setelah memeriksa repo, jalankan bundle install untuk menginstal dependensi.
Kemudian, jalankan bundle exec rake test untuk menjalankan tes. Anda juga dapat menjalankan bin/console untuk prompt interaktif yang akan memungkinkan Anda untuk bereksperimen.
Untuk menginstal permata ini ke mesin lokal Anda, jalankan bundle exec rake install . Untuk merilis versi baru, perbarui nomor versi di version.rb , dan kemudian jalankan bundle exec rake release , yang akan membuat tag Git untuk versi, Push Git Commits dan Tag yang dibuat, dan tekan file .gem ke rubygems.org.
Laporan bug dan permintaan tarik dipersilakan di GitHub.
Permata tersedia sebagai open source di bawah ketentuan lisensi MIT.