มันเป็น Ruby Clean และ API ระดับสูงถึง Chrome รันหัวเลี้ยวหัวต่อโดยค่าเริ่มต้น แต่คุณสามารถกำหนดค่าให้ทำงานในโหมดหัวขาด สิ่งที่คุณต้องการคือทับทิมและโครเมียมหรือโครเมียม Ferrum เชื่อมต่อกับเบราว์เซอร์โดยโปรโตคอล CDP และ ไม่มี การพึ่งพาซีลีเนียม/webdriver/Chromedriver เน้นที่โปรโตคอล CDP ดิบเพราะ Chrome ช่วยให้คุณทำหลายสิ่งหลายอย่างที่แทบจะไม่ได้รับการสนับสนุนจาก WebDriver เพราะควรมีการออกแบบที่สอดคล้องกับเบราว์เซอร์อื่น ๆ
Cuprite เป็นคนขับทับทิมบริสุทธิ์สำหรับ Capybara ตามเฟอร์รัม หากคุณกำลังจะรวบรวมไซต์คุณควรใช้เฟอร์รัมหรือเรือเพราะคุณรวบรวมข้อมูลไม่ใช่ทดสอบ
เฟรมเวิร์กการรวบรวมข้อมูลเว็บระดับสูงของเรือขึ้นอยู่กับเฟอร์รัมและเครื่องจักร
ไม่มีแพ็คเกจ Chrome หรือ Chromium อย่างเป็นทางการสำหรับ Linux อย่าติดตั้งด้วยวิธีนี้เพราะมันล้าสมัยหรือไม่เป็นทางการทั้งคู่ไม่ดี ดาวน์โหลดจากแหล่งที่เป็นทางการสำหรับ Chrome หรือ Chromium Chrome ไบนารีควรอยู่ใน PATH หรือ BROWSER_PATH และคุณสามารถส่งผ่านเป็นตัวเลือกในการอินสแตนซ์ของเบราว์เซอร์ดู :browser_path ในการปรับแต่ง
เพิ่มสิ่งนี้ลงใน Gemfile ของคุณและเรียกใช้ bundle install
gem "ferrum" นำทางไปยังเว็บไซต์และบันทึกภาพหน้าจอ:
browser = Ferrum :: Browser . new
browser . go_to ( "https://google.com" )
browser . screenshot ( path : "google.png" )
browser . quit เมื่อคุณทำงานกับอินสแตนซ์ของเบราว์เซอร์ Ferrum จะสร้างและดูแลหน้าเริ่มต้นสำหรับคุณจริง ๆ แล้ววิธีการทั้งหมดข้างต้นจะถูกส่งไปยังอินสแตนซ์หน้า page ที่สร้างขึ้นใน default_context ของอินสแตนซ์ browser เซอร์ คุณสามารถโต้ตอบกับหน้าสร้างด้วยตนเองและเป็นที่ต้องการ:
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://google.com" )
input = page . at_xpath ( "//input[@name='q']" )
input . focus . type ( "Ruby headless driver for Chrome" , :Enter )
page . at_css ( "a > h3" ) . text # => "rubycdp/ferrum: Ruby Chrome/Chromium driver - GitHub"
browser . quitประเมินจาวาสคริปต์บางส่วนและรับความกว้าง/ความสูงเต็ม:
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
width , height = page . evaluate <<~JS
[document.documentElement.offsetWidth,
document.documentElement.offsetHeight]
JS
# => [1024, 1931]
browser . quitทำการเคลื่อนไหวของเมาส์ที่คุณชอบ:
# Trace a 100x100 square
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://google.com" )
page . mouse
. move ( x : 0 , y : 0 )
. down
. move ( x : 0 , y : 100 )
. move ( x : 100 , y : 100 )
. move ( x : 100 , y : 0 )
. move ( x : 0 , y : 0 )
. up
browser . quit ใน Docker เป็นรูทคุณต้องผ่านตัวเลือกเบราว์เซอร์ที่ไม่มีแซนด์บ็อกซ์:
Ferrum :: Browser . new ( browser_options : { 'no-sandbox' : nil } )นอกจากนี้ยังมีรายงานว่ากระบวนการโครเมี่ยมล่มซ้ำ ๆ เมื่อทำงานภายในคอนเทนเนอร์ Docker บน M1 Mac ป้องกันไม่ให้เฟอร์รัมทำงาน เฟอร์รัมควรทำงานตามที่คาดไว้เมื่อนำไปใช้กับคอนเทนเนอร์ Docker บน Mac ที่ไม่ใช่ M1
คุณสามารถปรับแต่งตัวเลือกด้วยรหัสต่อไปนี้ในการตั้งค่าการทดสอบของคุณ:
Ferrum :: Browser . new ( options )Hash ตัวเลือก:headless (สตริง | บูลีน) - ตั้งเบราว์เซอร์เป็นหัวหัวหรือไม่ true โดยค่าเริ่มต้น คุณสามารถตั้งค่า "new" เพื่อรองรับโหมดหัวหัวใหม่:xvfb (บูลีน) - เรียกใช้เบราว์เซอร์ในเฟรมบัฟเฟอร์ false จริงโดยค่าเริ่มต้น:flatten (บูลีน) - ใช้การเชื่อมต่อ WebSocket หนึ่งครั้งกับเบราว์เซอร์และหน้าทั้งหมดในโหมดแบน:window_size (อาร์เรย์) - ขนาดของหน้าต่างเบราว์เซอร์ที่จะทดสอบแสดงเป็นอาร์เรย์ 2 องค์ประกอบเช่น [1024, 768] ค่าเริ่มต้น: [1024, 768]:extensions (อาร์เรย์ [สตริง | แฮช]) - อาร์เรย์ของพา ธ ไปยังไฟล์หรือซอร์สโค้ด JS ที่จะโหลดลงในเบราว์เซอร์เช่น: ["/path/to/script.js", { source: "window.secret = 'top'" }]:logger (วัตถุตอบสนองต่อ puts ) - เมื่อมีอยู่จะมีการเขียนเอาต์พุตดีพุทไปยังวัตถุนี้:slowmo (จำนวนเต็ม | ลอย) - ตั้งค่าล่าช้าในไม่กี่วินาทีเพื่อรอก่อนส่งคำสั่ง สหายที่เป็นประโยชน์ของตัวเลือกหัวขาดเพื่อให้คุณมีเวลาดูการเปลี่ยนแปลง:timeout (ตัวเลข) - จำนวนวินาทีที่เราจะรอการตอบกลับเมื่อสื่อสารกับเบราว์เซอร์ ค่าเริ่มต้นคือ 5:js_errors (บูลีน) - เมื่อจริงข้อผิดพลาด JavaScript ได้รับการยกขึ้นใหม่ใน Ruby:pending_connection_errors (บูลีน) - เมื่อเฟรมหลักยังคงรอการตอบกลับช้าในขณะที่การหมดเวลาถึงการดำเนิน PendingConnectionsError จะถูกยกขึ้น เป็นการดีกว่าที่จะทราบว่าทำไมคุณถึงตอบกลับช้าและแก้ไขหรือบล็อกพวกเขาแทนที่จะปิดการตั้งค่านี้ ค่าเริ่มต้นเป็นจริง:browser_name (สัญลักษณ์) - :chrome โดยค่าเริ่มต้นเฉพาะการสนับสนุนการทดลองสำหรับ :firefox สำหรับตอนนี้:browser_path (String) - Path ไปยัง Chrome Binary คุณยังสามารถตั้งค่าตัวแปร Env เป็น BROWSER_PATH=some/path/chrome bundle exec rspec:browser_options (แฮช)-ตัวเลือกบรรทัดคำสั่งเพิ่มเติมดูพวกเขาทั้งหมดเช่น { "ignore-certificate-errors" => nil }:ignore_default_browser_options (บูลีน) - เฟอร์รัมมีตัวเลือกเริ่มต้นจำนวนหนึ่งที่ส่งผ่านไปยังเบราว์เซอร์หากคุณตั้งค่าเป็น true แล้วตัวเลือกที่คุณใส่เท่านั้น :browser_options จะถูกส่งผ่านไปยังเบราว์เซอร์ยกเว้นตัวเลือกที่จำเป็นแน่นอน:port (จำนวนเต็ม) - พอร์ตการดีบักระยะไกลสำหรับโครเมี่ยมหัวขาด:host (สตริง) - ที่อยู่การดีบักระยะไกลสำหรับโครเมี่ยมหัวขาด:url (String) - URL สำหรับอินสแตนซ์ที่กำลังทำงานของ Chrome หากตั้งค่านี้กระบวนการเบราว์เซอร์จะไม่ถูกวางไข่:ws_url (String) - URL WebSocket สำหรับอินสแตนซ์ที่กำลังทำงานของ Chrome หากตั้งค่านี้กระบวนการเบราว์เซอร์จะไม่ถูกวางไข่ มันมีความสำคัญสูงกว่า :url การตั้งค่าทั้งสองไม่สมเหตุสมผล:process_timeout (จำนวนเต็ม) - ระยะเวลาที่จะรอให้กระบวนการ Chrome ตอบกลับเมื่อเริ่มต้น:ws_max_receive_size (จำนวนเต็ม) - ข้อความขนาดใหญ่ที่จะยอมรับจาก Chrome ผ่านช่องเสียบเว็บในไบต์ ค่าเริ่มต้นเป็น 64MB ข้อความที่เข้ามาใหญ่กว่านี้จะทำให้ Ferrum::DeadBrowserError:proxy (แฮช) - ระบุการตั้งค่าพร็อกซีอ่านเพิ่มเติม:save_path (String) - Path เพื่อบันทึกไฟล์แนบด้วยส่วนหัวของการกระจายเนื้อหา:env (แฮช) - ตัวแปรสภาพแวดล้อมที่คุณต้องการผ่านไปยังกระบวนการ Stringนำทางหน้าไปยัง
String url ควรมีรูปแบบเว้นแต่คุณจะตั้ง base_url เมื่อกำหนดค่าไดรเวอร์ page . go_to ( "https://github.com/" ) นำทางไปยังหน้าก่อนหน้าในประวัติศาสตร์
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back นำทางไปยังหน้าถัดไปในประวัติศาสตร์
page . go_to ( "https://github.com/" )
page . at_xpath ( "//a" ) . click
page . back
page . forward โหลดหน้าปัจจุบันใหม่
page . go_to ( "https://github.com/" )
page . refresh หยุดการนำทางทั้งหมดและโหลดทรัพยากรที่รอดำเนินการในหน้า
page . go_to ( "https://github.com/" )
page . stop ตั้งค่าตำแหน่งสำหรับหน้าต่างเบราว์เซอร์
Hash ตัวเลือกInteger ซ้ายInteger ด้านบน browser . position = { left : 10 , top : 20 } Array<Integer>รับตำแหน่งสำหรับหน้าต่างเบราว์เซอร์
browser . position # => [10, 20] กำหนดขอบเขตหน้าต่าง
Hash ตัวเลือกInteger ซ้ายInteger ด้านบนIntegerInteger สูงString browser . window_bounds = { left : 10 , top : 20 , width : 1024 , height : 768 , window_state : "normal" } Hash<String, Integer | String>รับขอบเขตหน้าต่าง
browser . window_bounds # => { "left": 0, "top": 1286, "width": 10, "height": 10, "windowState": "normal" } Integerรหัสหน้าต่างปัจจุบัน
browser . window_id # => 1 Node | nil ค้นหาโหนดโดยตัวเลือก เรียกใช้ document.querySelector ภายในเอกสารหรือโหนดที่ให้ไว้
String ตัวเลือกHash ตัวเลือกNode | nil page . go_to ( "https://github.com/" )
page . at_css ( "a[aria-label='Issues you created']" ) # => Node Array<Node> | [] ค้นหาโหนดโดยตัวเลือก วิธีการเรียกใช้ document.querySelectorAll ภายในเอกสารหรือโหนดที่ให้ไว้
String ตัวเลือกHash ตัวเลือกNode | nil page . go_to ( "https://github.com/" )
page . css ( "a[aria-label='Issues you created']" ) # => [Node] Node | nilค้นหาโหนดโดย XPath
String ตัวเลือกHash ตัวเลือกNode | nil page . go_to ( "https://github.com/" )
page . at_xpath ( "//a[@aria-label='Issues you created']" ) # => Node Array<Node> | []ค้นหาโหนดโดย XPath
String ตัวเลือกHash ตัวเลือกNode | nil page . go_to ( "https://github.com/" )
page . xpath ( "//a[@aria-label='Issues you created']" ) # => [Node] Stringส่งคืนตำแหน่งหน้าต่างด้านบนปัจจุบัน href
page . go_to ( "https://google.com/" )
page . current_url # => "https://www.google.com/" Stringส่งคืนชื่อหน้าต่างด้านบนปัจจุบัน
page . go_to ( "https://google.com/" )
page . current_title # => "Google" Stringส่งคืน HTML ของหน้าปัจจุบัน
page . go_to ( "https://google.com/" )
page . body # => '<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"><head>... String | Integerบันทึกภาพหน้าจอบนดิสก์หรือส่งคืนเป็น base64
Hash ตัวเลือกString พา ธ เพื่อบันทึกภาพหน้าจอบนดิสก์ :encoding จะถูกตั้งค่าเป็น :binary โดยอัตโนมัติSymbol การเข้ารหัส :base64 | :binary คุณสามารถตั้งค่าให้คืนภาพเป็น base64String "JPEG" ("JPG") | "png" | "webp"Integer 0-100 ใช้ได้กับ JPEG เท่านั้นBoolean เต็มไม่ว่าคุณจะต้องการภาพหน้าจอเต็มหน้าหรือวิวพอร์ตString CSS ตัวเลือกสำหรับองค์ประกอบที่กำหนดไม่บังคับHash พื้นที่สำหรับสกรีนช็อตเสริมIntegerIntegerIntegerInteger สูงFloat ซูมเข้า/ออกFerrum::RGBA.new(0, 0, 0, 0.0) เพื่อให้มีสีพื้นหลังเฉพาะ page . go_to ( "https://google.com/" )
# Save on the disk in PNG
page . screenshot ( path : "google.png" ) # => 134660
# Save on the disk in JPG
page . screenshot ( path : "google.jpg" ) # => 30902
# Save to Base64 the whole page not only viewport and reduce quality
page . screenshot ( full : true , quality : 60 , encoding : :base64 ) # "iVBORw0KGgoAAAANSUhEUgAABAAAAAMACAYAAAC6uhUNAAAAAXNSR0IArs4c6Q...
# Save on the disk with the selected element in PNG
page . screenshot ( path : "google.png" , selector : 'textarea' ) # => 11340
# Save to Base64 with an area of the page in PNG
page . screenshot ( path : "google.png" , area : { x : 0 , y : 0 , width : 400 , height : 300 } ) # => 54239
# Save with specific background color
page . screenshot ( background_color : Ferrum :: RGBA . new ( 0 , 0 , 0 , 0.0 ) ) String | Booleanบันทึก PDF บนดิสก์หรือส่งคืนเป็น base64
Hash ตัวเลือก : String พา ธ เพื่อบันทึก PDF บนดิสก์ :encoding จะถูกตั้งค่าเป็น :binary โดยอัตโนมัติ
: Symbol การเข้ารหัส :base64 | :binary คุณสามารถตั้งค่าให้ส่งคืน PDF เป็น base64
: การวางแนวกระดาษ Boolean ภูมิทัศน์ ค่าเริ่มต้นเป็นเท็จ
: สเกล Float ซูมเข้า/ออก
: รูปแบบ symbol ขนาดกระดาษมาตรฐาน: ตัวอักษร,: กฎหมาย ,: Tabloid ,: Ledger ,: a0 ,: a1 ,: a2 ,: a3 ,: a4 ,: a5 ,: a6
: PAPER_WIDTH Float SET WIDTH PAPER
: Paper_height Float ตั้งค่าความสูงของกระดาษ
ดูตัวเลือกดั้งเดิมอื่น ๆ ที่คุณสามารถผ่านได้
page . go_to ( "https://google.com/" )
# Save to disk as a PDF
page . pdf ( path : "google.pdf" , paper_width : 1.0 , paper_height : 1.0 ) # => true String | Integerบันทึก MHTML บนดิสก์หรือส่งคืนเป็นสตริง
Hash ตัวเลือกString พา ธ เพื่อบันทึกไฟล์บนดิสก์ page . go_to ( "https://google.com/" )
page . mhtml ( path : "google.mhtml" ) # => 87742 page.network
Array<Network::Exchange> ส่งคืนข้อมูลทั้งหมดเกี่ยวกับทราฟฟิกเครือข่ายเป็น Network::Exchange ซ์ซึ่งโดยทั่วไปเป็น wrapper เกี่ยวกับ request response และ error
page . go_to ( "https://github.com/" )
page . network . traffic # => [#<Ferrum::Network::Exchange, ...] Network::Requestคำขอหน้าของเฟรมหลัก
page . go_to ( "https://github.com/" )
page . network . request # => #<Ferrum::Network::Request... Network::Responseการตอบสนองหน้าของเฟรมหลัก
page . go_to ( "https://github.com/" )
page . network . response # => #<Ferrum::Network::Response... Integer มีรหัสสถานะของการตอบสนองหน้าหลัก (เช่น 200 สำหรับความสำเร็จ) นี่เป็นเพียงทางลัดสำหรับ response.status Status
page . go_to ( "https://github.com/" )
page . network . status # => 200 Boolean รอสำหรับการไม่ได้ใช้งานเครือข่ายส่งคืน true ในกรณีที่ประสบความสำเร็จและ false หากยังมีการเชื่อมต่อ
Hash ตัวเลือกInteger การเชื่อมต่อที่ได้รับอนุญาตให้เครือข่ายไม่ทำงาน 0 โดยค่าเริ่มต้นFloat ลอยอยู่ตามระยะเวลาที่กำหนดและตรวจสอบอีกครั้ง 0.05 โดยค่าเริ่มต้นFloat ในเวลาที่เราพยายามตรวจสอบไม่ได้ใช้งาน browser.timeout ตามค่าเริ่มต้น page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle # => true รอให้เครือข่ายไม่ได้ใช้งานหรือเพิ่มข้อผิดพลาด Ferrum::TimeoutError ยอมรับอาร์กิวเมนต์เดียวกันกับ wait_for_idle
page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle! # might raise an error ล้างแคชของหน้าหรือการจราจรที่รวบรวม
Symbol เป็น :traffic หรือ :cache traffic = page . network . traffic # => []
page . go_to ( "https://github.com/" )
traffic . size # => 51
page . network . clear ( :traffic )
traffic . size # => 0 ตั้งค่าการสกัดกั้นคำขอสำหรับตัวเลือกที่กำหนด วิธีนี้เป็นเพียงชุดการสกัดกั้นการร้องขอคุณควร on การโทรกลับเพื่อจับคำขอและยกเลิกหรือดำเนินการต่อ
Hash ตัวเลือกString รูปแบบ * โดยค่าเริ่มต้นSymbol หนึ่งในประเภททรัพยากร browser = Ferrum :: Browser . new
page = browser . create_page
page . network . intercept
page . on ( :request ) do | request |
if request . match? ( /bla-bla/ )
request . abort
elsif request . match? ( /lorem/ )
request . respond ( body : "Lorem ipsum" )
else
request . continue
end
end
page . go_to ( "https://google.com" ) หากไซต์หรือพร็อกซีใช้การอนุญาตคุณสามารถให้ข้อมูลรับรองโดยใช้วิธีนี้
Hash ตัวเลือกSymbol :server | :proxy หรือการอนุญาตพร็อกซีString ผู้ใช้Stringrequest.continue page . network . authorize ( user : "login" , password : "pass" ) { | req | req . continue }
page . go_to ( "http://example.com/authenticated" )
puts page . network . status # => 200
puts page . body # => Welcome, authenticated client เนื่องจาก Chrome ดำเนินการอนุญาตให้ใช้การสกัดกั้นการร้องขอคุณต้องดำเนินการต่อหรือยกเลิกคำขอที่ได้รับอนุญาต หากคุณมีรหัสที่ใช้การสกัดกั้นคุณสามารถใช้ authorize โดยไม่ต้องบล็อก แต่ถ้าไม่ใช่คุณจะต้องส่งผ่านบล็อกดังนั้นนี่คือเวอร์ชันไม่ผ่านบล็อกและสามารถทำงานได้ดี:
browser = Ferrum :: Browser . new
page = browser . create_page
page . network . intercept
page . on ( :request ) do | request |
if request . resource_type == "Image"
request . abort
else
request . continue
end
end
page . network . authorize ( user : "login" , password : "pass" , type : :proxy )
page . go_to ( "https://google.com" ) คุณเคยโทรหาวิธี authorize โดยไม่มีบล็อก แต่เนื่องจากมีการใช้งานโดยใช้การสกัดกั้นคำขออาจมีการปะทะกันกับส่วนอื่นของรหัสของคุณที่ใช้การสกัดกั้นการร้องขอดังนั้นการอนุญาตให้อนุญาตในขณะที่รหัสของคุณปฏิเสธ แต่มันก็สายเกินไป บล็อกเป็นข้อบังคับในขณะนี้
เปิดใช้งานการจำลองสภาพเครือข่าย
Hash ตัวเลือกBoolean ออฟไลน์เลียนแบบการขาดการเชื่อมต่ออินเทอร์เน็ตโดยค่าเริ่ม falseInteger Latency ขั้นต่ำจากคำขอที่ส่งไปยังส่วนหัวการตอบกลับที่ได้รับ (MS), 0 โดยค่าเริ่มต้นInteger Maximal Maximal Download Rownload (bytes/sec), -1 โดยค่าเริ่มต้นปิดการดาวน์โหลดการควบคุมปริมาณInteger สูงสุดอัพโหลดปริมาณงาน (ไบต์/วินาที), -1 โดยค่าเริ่มต้นปิดใช้งานการดาวน์โหลดการควบคุมปริมาณString ประเภทการเชื่อมต่อถ้าเป็นที่รู้จัก, หนึ่งใน: ไม่มี, cellular2g, cellular3g, cellular4g, บลูทู ธ , อีเธอร์เน็ต, wifi, wiMax, อื่น ๆ nil เริ่มต้น page . network . emulate_network_conditions ( connection_type : "cellular2g" )
page . go_to ( "https://github.com/" ) เปิดใช้งานโหมดออฟไลน์สำหรับหน้า
page . network . offline_mode
page . go_to ( "https://github.com/" ) # => Ferrum::StatusError (Request to https://github.com/ failed(net::ERR_INTERNET_DISCONNECTED)) Boolean )สลับการละเว้นแคชสำหรับแต่ละคำขอ หากเป็นจริงแคชจะไม่ถูกใช้
page . network . cache ( disable : true ) page.downloads
Array<Hash> ส่งคืนข้อมูลทั้งหมดเกี่ยวกับไฟล์ที่ดาวน์โหลดเป็น Hash
page . go_to ( "http://localhost/attachment.pdf" )
page . downloads . files # => [{"frameId"=>"E3316DF1B5383D38F8ADF7485005FDE3", "guid"=>"11a68745-98ac-4d54-9b57-9f9016c268b3", "url"=>"http://localhost/attachment.pdf", "suggestedFilename"=>"attachment.pdf", "totalBytes"=>4911, "receivedBytes"=>4911, "state"=>"completed"}] รอจนกว่าการดาวน์โหลดจะเสร็จสิ้น
page . go_to ( "http://localhost/attachment.pdf" )
page . downloads . waitหรือ
page . go_to ( "http://localhost/page" )
page . downloads . wait { page . at_css ( "#download" ) . click } ตั้งค่าพฤติกรรมในกรณีที่ไฟล์ที่จะดาวน์โหลด
Hash ตัวเลือกString Path Absolute ของสถานที่จัดเก็บไฟล์Symbol พฤติกรรม deny | allow | allowAndName | default allow โดยค่าเริ่มต้น page . go_to ( "https://example.com/" )
page . downloads . set_behavior ( save_path : "/tmp" , behavior : :allow ) คุณสามารถตั้งค่าพร็อกซีด้วยตัวเลือก :proxy :
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , user : "user" , password : "pa$$" } ) :bypass สามารถระบุรายการโฮสต์ที่คั่นด้วยออลเนสส์กึ่งซึ่งไม่ควรใช้พร็อกซี:
Ferrum :: Browser . new ( proxy : { host : "x.x.x.x" , port : "8800" , bypass : "*.google.com;*foo.com" } )โดยทั่วไปผ่านตัวเลือกพร็อกซีเมื่ออินสแตนซ์เบราว์เซอร์ส่งผลให้เบราว์เซอร์ทำงานด้วยธงบรรทัดคำสั่งพร็อกซีเพื่อให้มีผลกระทบต่อหน้าและบริบททั้งหมด คุณสามารถสร้างหน้าในบริบทใหม่ซึ่งสามารถใช้การตั้งค่าพร็อกซีของตัวเอง:
browser = Ferrum :: Browser . new
browser . create_page ( proxy : { host : "x.x.x.x" , port : 31337 , user : "user" , password : "password" } ) do | page |
page . go_to ( "https://api.ipify.org?format=json" )
page . body # => "x.x.x.x"
end
browser . create_page ( proxy : { host : "y.y.y.y" , port : 31337 , user : "user" , password : "password" } ) do | page |
page . go_to ( "https://api.ipify.org?format=json" )
page . body # => "y.y.y.y"
end page.mouse
หน้าเลื่อนไปยัง X, Y ที่กำหนด
Integer พิกเซลตามแกนแนวนอนของเอกสารที่คุณต้องการแสดงทางด้านซ้ายบนInteger พิกเซลตามแกนแนวตั้งของเอกสารที่คุณต้องการแสดงทางด้านซ้ายบน page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . mouse . scroll_to ( 0 , 400 ) Mouseคลิกที่พิกัดที่กำหนดยิงเมาส์เคลื่อนย้ายลงและเพิ่มเหตุการณ์
Hash ตัวเลือกIntegerIntegerFloat เริ่มต้นไปที่ 0. การหน่วงเวลาระหว่างเมาส์ลงและเหตุการณ์เมาส์Symbol ปุ่ม: ซ้าย | : ขวาค่าเริ่มต้นเป็น: ซ้ายInteger เริ่มต้นเป็น 1Integer Bitfield สำหรับตัวดัดแปลงคีย์ ดู keyboard.modifiers Mouseเมาส์ลงสำหรับพิกัดที่กำหนด
Hash ตัวเลือกSymbol ปุ่ม: ซ้าย | : ขวาค่าเริ่มต้นเป็น: ซ้ายInteger เริ่มต้นเป็น 1Integer Bitfield สำหรับตัวดัดแปลงคีย์ ดู keyboard.modifiers Mouseเมาส์ขึ้นสำหรับพิกัดที่กำหนด
Hash ตัวเลือกSymbol ปุ่ม: ซ้าย | : ขวาค่าเริ่มต้นเป็น: ซ้ายInteger เริ่มต้นเป็น 1Integer Bitfield สำหรับตัวดัดแปลงคีย์ ดู keyboard.modifiers Mouseเมาส์ย้ายไปที่ x และ y
Hash ตัวเลือกIntegerIntegerInteger จำนวนเต็มไปที่ 1 ส่งเหตุการณ์ mousemove ระดับกลาง page.keyboard
Keyboardส่งเหตุการณ์คีย์ดาวน์
String | ชื่อ Symbol ของคีย์เช่น "A" ,: Enter ,: backspace Keyboardส่งเหตุการณ์ Keyup
String | ชื่อ Symbol ของคีย์เช่น "B" ,: Enter ,: backspace Keyboardส่ง Keydown, Keypress/Input และ KeyUp Event สำหรับแต่ละอักขระในข้อความ
String ข้อความ | Array<String> | Array<Symbol> ข้อความที่จะพิมพ์ลงในองค์ประกอบที่เน้น [:Shift, "s"], "tring" Integerส่งคืน bitfield สำหรับคีย์ที่กำหนด
Array<Symbol> : alt | : Ctrl | : คำสั่ง | :กะ page.cookies
Hash<String, Cookie>ส่งคืนคุกกี้แฮช
page . cookies . all # => {"NID"=>#<Ferrum::Cookies::Cookie:0x0000558624b37a40 @attributes={"name"=>"NID", "value"=>"...", "domain"=>".google.com", "path"=>"/", "expires"=>1583211046.575681, "size"=>178, "httpOnly"=>true, "secure"=>false, "session"=>false}>} Cookieส่งคืนคุกกี้
String ค่า page . cookies [ "NID" ] # => <Ferrum::Cookies::Cookie:0x0000558624b67a88 @attributes={"name"=>"NID", "value"=>"...", "domain"=>".google.com", "path"=>"/", "expires"=>1583211046.575681, "size"=>178, "httpOnly"=>true, "secure"=>false, "session"=>false}> Booleanตั้งค่าคุกกี้
Hash ค่าString ชื่อString ค่าString โดเมนIntegerString 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 Booleanลบคุกกี้
Hash ตัวเลือกString ชื่อString โดเมนString URL page . cookies . remove ( name : "stealth" , domain : "google.com" ) # => true Booleanลบคุกกี้ทั้งหมดสำหรับหน้าปัจจุบัน
page . cookies . clear # => true Booleanจัดเก็บคุกกี้ทั้งหมดของหน้าปัจจุบันในไฟล์
# Cookies are saved into cookies.yml
page . cookies . store # => 15657 Booleanโหลดคุกกี้ทั้งหมดจากไฟล์และตั้งค่าสำหรับหน้าปัจจุบัน
# Cookies are loaded from cookies.yml
page . cookies . load # => true page.headers
Hashรับส่วนหัวทั้งหมด
Booleanชุดส่วนหัวที่กำหนด ในที่สุดก็ล้างส่วนหัวทั้งหมดและตั้งค่าให้
Hash คีย์-ค่าคู่ตัวอย่างเช่น "User-Agent" => "Browser" Booleanเพิ่มส่วนหัวที่กำหนดให้ตั้งค่าแล้ว
Hash คีย์-ค่าคู่ตัวอย่างเช่น "Referer" => "http://example.com" Booleanล้างส่วนหัวทั้งหมด
ประเมินผลและส่งคืนผลลัพธ์สำหรับนิพจน์ JS ที่กำหนด
String นิพจน์ควรเป็นจาวาสคริปต์ที่ถูกต้องObject Args คุณสามารถผ่านอาร์กิวเมนต์ได้แม้ว่ามันควรจะเป็น Node ที่ถูกต้องหรือค่าง่าย ๆ page . evaluate ( "[window.scrollX, window.scrollY]" ) ประเมินการแสดงออกแบบอะซิงโครนัสและผลการส่งคืน
String นิพจน์ควรเป็นจาวาสคริปต์ที่ถูกต้องObject Args คุณสามารถผ่านอาร์กิวเมนต์ได้แม้ว่ามันควรจะเป็น Node ที่ถูกต้องหรือค่าง่าย ๆ page . evaluate_async ( %(arguments[0]({foo: "bar"})) , 5 ) # => { "foo" => "bar" } ดำเนินการนิพจน์ ไม่ส่งคืนผลลัพธ์
String นิพจน์ควรเป็นจาวาสคริปต์ที่ถูกต้องObject Args คุณสามารถผ่านอาร์กิวเมนต์ได้แม้ว่ามันควรจะเป็น Node ที่ถูกต้องหรือค่าง่าย ๆ page . execute ( %(1 + 1) ) # => true ประเมิน JavaScript เพื่อแก้ไขสิ่งต่าง ๆ ก่อนโหลดหน้าเว็บ
String นิพจน์ควรเป็นจาวาสคริปต์ที่ถูกต้อง browser . evaluate_on_new_document <<~JS
Object.defineProperty(navigator, "languages", {
get: function() { return ["tlh"]; }
});
JS BooleanHash ตัวเลือกString URLString เส้นทางString เนื้อหาString - text/javascript โดยค่าเริ่มต้น page . add_script_tag ( url : "http://example.com/stylesheet.css" ) # => true BooleanHash ตัวเลือกString URLString เส้นทางString เนื้อหา page . add_style_tag ( content : "h1 { font-size: 40px; }" ) # => true BooleanHash ตัวเลือกBoolean true โดยค่าเริ่มต้น page . bypass_csp # => true
page . go_to ( "https://github.com/ruby-concurrency/concurrent-ruby/blob/master/docs-source/promises.in.md" )
page . refresh
page . add_script_tag ( content : "window.__injected = 42" )
page . evaluate ( "window.__injected" ) # => 42 ปิดใช้งาน JavaScripts จากแหล่ง HTML ที่โหลด คุณยังสามารถประเมิน JavaScript ด้วย evaluate หรือ execute ไม่คืนสิ่งใด
page . disable_javascript แทนที่ขนาดของหน้าจออุปกรณ์และเลียนแบบวิวพอร์ต
Hash ตัวเลือกInteger ความกว้าง, ความกว้างของวิวพอร์ต 0 โดยค่าเริ่มต้นInteger , ความสูงของวิวพอร์ต 0 โดยค่าเริ่มต้นFloat , ปัจจัยระดับอุปกรณ์ 0 โดยค่าเริ่มต้นBoolean มือถือไม่ว่าจะเลียนแบบอุปกรณ์มือถือหรือไม่ false โดยค่าเริ่มต้น page . set_viewport ( width : 1000 , height : 600 , scale_factor : 3 ) Array[Frame] | []ส่งคืนเฟรมทั้งหมดหน้าปัจจุบันมี
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . frames # =>
# [
# #<Ferrum::Frame @id="C6D104CE454A025FBCF22B98DE612B12" @parent_id=nil @name=nil @state=:stopped_loading @execution_id=1>,
# #<Ferrum::Frame @id="C09C4E4404314AAEAE85928EAC109A93" @parent_id="C6D104CE454A025FBCF22B98DE612B12" @state=:stopped_loading @execution_id=2>,
# #<Ferrum::Frame @id="2E9C7F476ED09D87A42F2FEE3C6FBC3C" @parent_id="C6D104CE454A025FBCF22B98DE612B12" @state=:stopped_loading @execution_id=3>,
# ...
# ] Frameส่งคืนเฟรมหลักของหน้า, ด้านบนของต้นไม้และผู้ปกครองของเฟรมทั้งหมด
Frame | nilค้นหาเฟรมตามตัวเลือกที่กำหนด
Hash ตัวเลือกString - ID ของเฟรมที่ไม่ซ้ำกันที่เบราว์เซอร์ให้String - ชื่อของเฟรมถ้ามีหนึ่ง page . frame_by ( id : "C6D104CE454A025FBCF22B98DE612B12" ) Stringรหัสที่ไม่ซ้ำกันของเฟรม
String | nilรหัสเฟรมหลักถ้าอันนี้ซ้อนกันในอีกอันหนึ่ง
IntegerID บริบทการดำเนินการซึ่งใช้โดย JS แต่ละเฟรมมีบริบทของตัวเองที่ JS ประเมิน
String | nilหากเฟรมได้รับชื่อมันควรจะอยู่ที่นี่
Symbol | nilหนึ่งในสเตทเฟรมใน:
:started_loading:navigated:stopped_loadingStringส่งคืนตำแหน่งของเฟรมปัจจุบัน
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . url # => https://interactive-examples.mdn.mozilla.net/pages/tabbed/iframe.html ส่งคืนชื่อเฟรมปัจจุบัน
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . title # => HTML Demo: <iframe> Booleanหากเฟรมปัจจุบันเป็นเฟรมหลักของหน้า (ด้านบนของต้นไม้)
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . main? # => false Stringส่งคืนตำแหน่งหน้าต่างด้านบนของเฟรมปัจจุบัน href
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_url # => "https://www.w3schools.com/tags/tag_frame.asp" Stringส่งคืนชื่อหน้าต่างด้านบนของเฟรมปัจจุบัน
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_title # => "HTML frame tag" Stringส่งคืน HTML ของเฟรมปัจจุบัน
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . body # => "<html><head></head><body></body></html>" ส่งคืนเอกสารของเฟรมปัจจุบัน
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . main_frame . doctype # => "<!DOCTYPE html>" ตั้งค่าเนื้อหาของเฟรมที่กำหนด
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> ยอมรับกล่องโต้ตอบด้วยข้อความที่กำหนดหรือพรอมต์เริ่มต้นหากมี
String ข้อความ ยกเลิกการโต้ตอบ
page . on ( :dialog ) do | dialog |
if dialog . match? ( /bla-bla/ )
dialog . accept
else
dialog . dismiss
end
end
page . go_to ( "https://google.com" ) คุณสามารถชะลอตัวลงหรือเร่งความเร็วแอนิเมชั่น CSS
Integer ส่งคืนอัตราการเล่นสำหรับภาพเคลื่อนไหว CSS ค่าเริ่มต้นเป็น 1
ตั้งค่าอัตราการเล่นของแอนิเมชั่น CSS
Integer page . playback_rate = 2000
page . go_to ( "https://google.com" )
page . playback_rate # => 2000 Boolean Frameส่งคืนวัตถุเฟรมสำหรับโหนดปัจจุบันคุณสามารถใช้ Finders สำหรับวัตถุนั้นได้:
frame = page . at_xpath ( "//iframe" ) . frame # => Frame
frame . at_css ( "//a[text() = 'Log in']" ) # => Node Boolean Array<Node> Node | nil ): Boolean (chainable) เลือกตัวเลือกโดยผ่านแอตทริบิวต์
page . at_xpath ( "//*[select]" ) . select ( [ "1" ] ) # => Node (select)
page . at_xpath ( "//*[select]" ) . select ( [ "text" ] , by : :text ) # => Node (select)ยอมรับสตริงอาร์เรย์หรือสตริง:
page . at_xpath ( "//*[select]" ) . select ( "1" )
page . at_xpath ( "//*[select]" ) . select ( "1" , "2" )
page . at_xpath ( "//*[select]" ) . select ( [ "1" , "2" ] ) คุณสามารถใช้ tracing.record เพื่อสร้างไฟล์ติดตามซึ่งสามารถเปิดได้ใน Chrome Devtools หรือ Timeline Viewer
page . tracing . record ( path : "trace.json" ) do
page . go_to ( "https://www.google.com" )
end String ยอมรับบล็อกบันทึกการติดตามและโดยค่าเริ่มต้นส่งคืนข้อมูลการติดตามจาก Tracing.tracingComplete เป็นเอาต์พุต เมื่อ path ถูกระบุส่งคืน true และเก็บข้อมูลติดตามลงในไฟล์
Hash ตัวเลือกString บันทึกข้อมูลบนดิสก์ nil เริ่มต้นSymbol การเข้ารหัส :base64 | :binary เข้ารหัสเอาต์พุตเป็น base64 หรือข้อความธรรมดา :binary โดยค่าเริ่มต้นFloat รอจนกว่าการสตรีมไฟล์จะเสร็จสิ้นในเวลาที่กำหนดหรือเพิ่มข้อผิดพลาดค่าเริ่มต้นเป็น nilBoolean อตจับภาพหน้าจอในการติดตาม false โดยค่าเริ่มต้นHash<String, Object> config สำหรับการติดตาม, สำหรับหมวดหมู่ดู getCategories, การกำหนดค่าการติดตามเพียงครั้งเดียวเท่านั้นที่สามารถใช้งานได้ในแต่ละครั้งต่อเบราว์เซอร์ ปิดแท็บเบราว์เซอร์ที่เปิดโดยอินสแตนซ์ Browser
# connect to a long-running Chrome process
browser = Ferrum :: Browser . new ( url : 'http://localhost:9222' )
browser . go_to ( "https://github.com/" )
# clean up, lest the tab stays there hanging forever
browser . reset
browser . quit เฟอร์รัมนั้นปลอดภัยอย่างเต็มที่ คุณสามารถสร้างเบราว์เซอร์หนึ่งตัวหรือไม่กี่อย่างที่คุณต้องการและเริ่มเล่นรอบ ๆ โดยใช้เธรด ตัวอย่างด้านล่างแสดงวิธีการสร้างหน้าสองสามหน้าซึ่งแชร์บริบทเดียวกัน บริบทคล้ายกับโปรไฟล์ที่ไม่ระบุตัวตน แต่คุณสามารถมีมากกว่าหนึ่งคิดว่ามันเป็นเซสชันเบราว์เซอร์อิสระ:
browser = Ferrum :: Browser . new
context = browser . contexts . create
t1 = Thread . new ( context ) do | c |
page = c . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . screenshot ( path : "t1.png" )
end
t2 = Thread . new ( context ) do | c |
page = c . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+static+typing" )
page . screenshot ( path : "t2.png" )
end
t1 . join
t2 . join
context . dispose
browser . quitหรือคุณสามารถสร้างบริบทอิสระสองบริบท:
browser = Ferrum :: Browser . new
t1 = Thread . new ( browser ) do | b |
context = b . contexts . create
page = context . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . screenshot ( path : "t1.png" )
context . dispose
end
t2 = Thread . new ( browser ) do | b |
context = b . contexts . create
page = context . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+static+typing" )
page . screenshot ( path : "t2.png" )
context . dispose
end
t1 . join
t2 . join
browser . quit หลังจากตรวจสอบ repo แล้วให้เรียกใช้ bundle install เพื่อติดตั้งการพึ่งพา
จากนั้นเรียกใช้ bundle exec rake test เพื่อเรียกใช้การทดสอบ นอกจากนี้คุณยังสามารถเรียกใช้ bin/console สำหรับพรอมต์แบบโต้ตอบที่จะช่วยให้คุณสามารถทดลองได้
ในการติดตั้งอัญมณีนี้ลงบนเครื่องในเครื่องของคุณให้เรียกใช้ bundle exec rake install หากต้องการเปิดตัวเวอร์ชันใหม่ให้อัปเดตหมายเลขเวอร์ชันใน version.rb จากนั้นเรียกใช้ bundle exec rake release ซึ่งจะสร้างแท็ก GIT สำหรับเวอร์ชัน Push Git Commits และแท็กที่สร้างขึ้นและกดไฟล์ .gem ไปยัง rubygems.org
รายงานข้อผิดพลาดและคำขอดึงยินดีต้อนรับบน GitHub
อัญมณีมีให้เป็นโอเพ่นซอร์สภายใต้ข้อกำหนดของใบอนุญาต MIT