它是红宝石干净的,高级的API到Chrome。默认情况下,无头运行,但是您可以将其配置为以头部模式运行。您只需要Ruby,Chrome或Chromium。 Ferrum通过CDP协议连接到浏览器,并且没有Selenium/Web Driver/Chromedriver依赖性。重点是对RAW CDP协议的重点,因为Chrome允许您做很多Web Driver几乎没有支持的事情,因为它应该与其他浏览器具有一致的设计。
Cuprite是基于Ferrum的Capybara的纯红宝司机。如果您要去爬网站,则最好因为爬行而不是测试,因此最好使用Ferrum或船只。
船只基于Ferrum和机械化的高级网络爬行框架。
Linux没有官方的铬或铬套件不会以这种方式安装,因为它已经过时或非正式,都不好。从Chrome或Chromium的官方来源下载它。 Chrome Binary应该在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为您创建并维护一个默认页面时,实际上,上面的所有方法都发送到browser实例的default_context中创建的page实例。您可以与手动创建的页面进行交互,这是首选:
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://google.com" )
input = page . at_xpath ( "//input[@name='q']" )
input . focus . type ( "Ruby headless driver for Chrome" , :Enter )
page . at_css ( "a > h3" ) . text # => "rubycdp/ferrum: Ruby Chrome/Chromium driver - GitHub"
browser . quit评估一些JavaScript并获得全宽/高度:
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
width , height = page . evaluate <<~JS
[document.documentElement.offsetWidth,
document.documentElement.offsetHeight]
JS
# => [1024, 1931]
browser . quit执行您喜欢的任何鼠标动作:
# Trace a 100x100 square
browser = Ferrum :: Browser . new
page = browser . create_page
page . go_to ( "https://google.com" )
page . mouse
. move ( x : 0 , y : 0 )
. down
. move ( x : 0 , y : 100 )
. move ( x : 100 , y : 100 )
. move ( x : 100 , y : 0 )
. move ( x : 0 , y : 0 )
. up
browser . quit 在Docker中,您必须传递No-SandBox浏览器选项:
Ferrum :: Browser . new ( browser_options : { 'no-sandbox' : nil } )还报道说,在M1 MAC上跑到Docker容器中时,Chrome过程反复崩溃,以防止Ferrum工作。当在非M1 Mac上部署到Docker容器时,Ferrum应按预期工作。
您可以在测试设置中使用以下代码自定义选项:
Ferrum :: Browser . new ( options )Hash:headless true情况下,将浏览器设置为无头或无头。您可以设置"new"以支持新的无头模式。:xvfb (boolean) - 在虚拟框架器中运行浏览器,默认情况下为false 。:flatten (Boolean) - 使用一个Websocket连接到浏览器和所有页面以平坦模式。:window_size (array) - 浏览器窗口的尺寸在其中测试,以2个元素数组表示,例如[1024,768]。默认值:[1024,768]:extensions (array [string | hash]) - 文件或js源代码的一系列路径,要预加载到浏览器中: ["/path/to/script.js", { source: "window.secret = 'top'" }]:logger (对象响应puts ) - 当存在时,将调试输出写入此对象。:slowmo (integer | float) - 在发送命令之前将延迟设置为几秒钟。无头选项的有用伴侣,因此您有时间看到更改。:timeout (数字) - 与浏览器通信时,我们将等待响应的秒数。默认值为5。:js_errors (布尔值) - 当Ruby中,JavaScript错误会重新升高。:pending_connection_errors (boolean) - 当主帧仍在等待缓慢的响应时,请及时提高PendingConnectionsError 。最好弄清楚为什么您的响应缓慢,修复或阻止它们,而不是关闭此设置。默认是正确的。:browser_name (符号) - :chrome ,仅实验支持:firefox 。:browser_path (string) - 通往Chrome二进制的路径,您还可以将ENV变量设置为BROWSER_PATH=some/path/chrome bundle exec rspec 。:browser_options (hash) - 附加命令行选项,请参阅所有内容,例如{ "ignore-certificate-errors" => nil }:ignore_default_browser_options (boolean) - Ferrum具有将其传递给浏览器的许多默认选项,如果将其设置为true ,则只有您放入的选项:browser_options将传递给浏览器,除了必需的选项。:port (整数) - 无头铬的远程调试端口。:host (字符串) - 无头铬的远程调试地址。:url (string) - Chrome运行实例的URL。如果设置此设置,则不会产生浏览器过程。:ws_url (String) - Chrome运行实例的WebSocket URL。如果设置此设置,则不会产生浏览器过程。优先级高于:url ,设置两者都没有意义。:process_timeout (integer) - 等待铬流程在启动时响应多长时间。:ws_max_receive_size (INTEGER) - 在字节中从Web插座上接受Chrome的大消息。默认为64MB。传入的消息大于此会导致Ferrum::DeadBrowserError 。:proxy (哈希) - 指定代理设置,阅读更多:save_path (string) - 用内容分配标头保存附件的路径。: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 设置浏览器窗口的位置
HashIntegerInteger browser . position = { left : 10 , top : 20 } Array<Integer>获取浏览器窗口的位置
browser . position # => [10, 20] 设置窗口边界
HashIntegerIntegerIntegerIntegerString browser . window_bounds = { left : 10 , top : 20 , width : 1024 , height : 768 , window_state : "normal" } Hash<String, Integer | String>获取窗口界
browser . window_bounds # => { "left": 0, "top": 1286, "width": 10, "height": 10, "windowState": "normal" } Integer当前窗口ID
browser . window_id # => 1 Node | nil通过选择器查找节点。在文档中运行document.querySelector或提供节点。
StringHashNode |中nil page . go_to ( "https://github.com/" )
page . at_css ( "a[aria-label='Issues you created']" ) # => Node Array<Node> | []通过选择器查找节点。该方法在文档中运行document.querySelectorAll或提供的节点。
StringHashNode |中nil page . go_to ( "https://github.com/" )
page . css ( "a[aria-label='Issues you created']" ) # => [Node] Node | nil通过XPath查找节点。
StringHashNode |中nil page . go_to ( "https://github.com/" )
page . at_xpath ( "//a[@aria-label='Issues you created']" ) # => Node Array<Node> | []通过XPath查找节点。
StringHashNode |中nil page . go_to ( "https://github.com/" )
page . xpath ( "//a[@aria-label='Issues you created']" ) # => [Node] String返回当前顶部窗口位置HREF。
page . go_to ( "https://google.com/" )
page . current_url # => "https://www.google.com/" String返回当前顶部窗口标题
page . go_to ( "https://google.com/" )
page . current_title # => "Google" String返回当前页面的HTML。
page . go_to ( "https://google.com/" )
page . body # => '<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"><head>... String | Integer将屏幕截图保存在磁盘上或将其返回为基本64。
HashString以在磁盘上保存屏幕快照。 :encoding将设置为:binarySymbol :base64 | :binary您可以将其设置为返回图像为base64String “ jpeg”(“ jpg”)| “ PNG” | “ WebP”Integer 0-100仅适用于JPEGBoolean无论您需要全页屏幕截图还是视图String CSS选择器给定元素,可选Hash区域可选IntegerIntegerIntegerIntegerFloat缩放进出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纸取向。默认为false。
:秤Float缩放进出
:格式symbol标准纸尺寸:字母,:法律,:小报,:分类帐,:a0,:a1,:a2,:a3,:a3,:a4,:a4,:a5,:a6
:paper_width Float设置纸张宽度
: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保存在磁盘上或将其返回为字符串。
HashString以将文件保存在磁盘上。 page . go_to ( "https://google.com/" )
page . mhtml ( path : "google.mhtml" ) # => 87742 page.network
Array<Network::Exchange>将有关网络流量的所有信息返回Network::Exchange实例,通常是围绕request , response和error包装器。
page . go_to ( "https://github.com/" )
page . network . traffic # => [#<Ferrum::Network::Exchange, ...] Network::Request主帧的页面请求。
page . go_to ( "https://github.com/" )
page . network . request # => #<Ferrum::Network::Request... Network::Response主帧的页面响应。
page . go_to ( "https://github.com/" )
page . network . response # => #<Ferrum::Network::Response... Integer包含主页响应的状态代码(例如,成功的200)。这只是response.status的快捷方式。
page . go_to ( "https://github.com/" )
page . network . status # => 200 Boolean等待网络空闲,在成功的情况下返回true ,如果仍然存在连接,则false 。
HashInteger允许网络闲置多少个连接,默认为0Float睡眠时间给定时间和再次检查,默认情况下为0.05Float在我们什么时候尝试检查idle, browser.timeout默认情况下 page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle # => true 等待网络空闲或增加Ferrum::TimeoutError错误。接受与wait_for_idle相同的参数。
page . go_to ( "https://example.com/" )
page . at_xpath ( "//a[text() = 'No UI changes button']" ) . click
page . network . wait_for_idle! # might raise an error 清除页面的缓存或收集的流量。
Symbol是:traffic或:cache traffic = page . network . traffic # => []
page . go_to ( "https://github.com/" )
traffic . size # => 51
page . network . clear ( :traffic )
traffic . size # => 0 设置给定选项的请求拦截。此方法仅设置请求拦截,您应on回调上使用来捕获请求并流产或继续。
HashString *Symbol其中一种资源类型之一 browser = Ferrum :: Browser . new
page = browser . create_page
page . network . intercept
page . on ( :request ) do | request |
if request . match? ( /bla-bla/ )
request . abort
elsif request . match? ( /lorem/ )
request . respond ( body : "Lorem ipsum" )
else
request . continue
end
end
page . go_to ( "https://google.com" ) 如果网站或代理使用授权,则可以使用此方法提供凭据。
HashSymbol :server | :proxy网站或代理授权StringStringrequest.continue 。 page . network . authorize ( user : "login" , password : "pass" ) { | req | req . continue }
page . go_to ( "http://example.com/authenticated" )
puts page . network . status # => 200
puts page . body # => Welcome, authenticated client由于Chrome使用请求拦截实施授权,因此您必须继续或中止授权请求。如果您已经有使用拦截的代码,则可以在没有块的情况下使用authorize ,但是如果不是,则您必须通过块,因此这是版本不会通过块,并且可以正常工作:
browser = Ferrum :: Browser . new
page = browser . create_page
page . network . intercept
page . on ( :request ) do | request |
if request . resource_type == "Image"
request . abort
else
request . continue
end
end
page . network . authorize ( user : "login" , password : "pass" , type : :proxy )
page . go_to ( "https://google.com" )您曾经调用authorize方法无块,但是由于使用请求拦截实现了它,因此代码的另一部分也可能会发生碰撞,该代码也使用请求拦截,因此授权允许请求,而您的代码拒绝,但为时已晚。现在是强制性的。
激活网络条件的仿真。
HashBoolean模仿互联网断开,默认为falseInteger最小延迟,从发送到收到的响应标头(MS),默认为0Integer最大汇总下载吞吐量(bytes/sec), -1默认情况下,禁用下载throttlingInteger最大汇总上传吞吐量(bytes/sec), -1默认情况下,禁用下载throttlingString连接类型如果已知,则是:无: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 } 在要下载文件的情况下设置行为。
HashString绝对路径在哪里存储文件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"
endpage.mouse
滚动页到给定的x,y
Integer沿着您想要显示在左上方显示的文档的水平轴的像素Integer沿着您想要显示在左上方的文档的垂直轴的像素 page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . mouse . scroll_to ( 0 , 400 ) Mouse单击给定的坐标,启动鼠标移动,向下和向上事件。
HashIntegerIntegerFloat默认值为0。鼠标向下和鼠标UP事件之间的延迟Symbol :左| :对,默认为:左Integer默认为1Integer BITFIELD,用于关键修饰符。请参阅keyboard.modifiers Mouse鼠标降低给定坐标。
HashSymbol :左| :对,默认为:左Integer默认为1Integer BITFIELD,用于关键修饰符。请参阅keyboard.modifiers Mouse鼠标以给定坐标。
HashSymbol :左| :对,默认为:左Integer默认为1Integer BITFIELD,用于关键修饰符。请参阅keyboard.modifiers Mouse鼠标移动给定X和Y。
HashIntegerIntegerInteger默认为1。发送中间的Mousemove事件。page.keyboard
Keyboard调度键盘事件。
String |键的Symbol名称,例如“ a”,:enter,:backpace Keyboard派遣关键事件。
String |键的Symbol名称,例如“ B”,:Enter,:Backspace Keyboard为文本中的每个字符发送一个键down,按键/输入和键盘事件。
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返回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设置一个cookie
HashStringStringStringIntegerStringBoolean page . cookies . set ( name : "stealth" , value : "omg" , domain : "google.com" ) # => trueCookie nid_cookie = page . cookies [ "NID" ] # => <Ferrum::Cookies::Cookie:0x0000558624b67a88>
page . cookies . set ( nid_cookie ) # => true Boolean去除给定饼干
HashStringStringString page . cookies . remove ( name : "stealth" , domain : "google.com" ) # => true Boolean删除当前页面的所有饼干
page . cookies . clear # => true Boolean将当前页面的所有cookie存储在文件中。
# Cookies are saved into cookies.yml
page . cookies . store # => 15657 Boolean从文件中加载所有cookie,并将其设置为当前页面。
# Cookies are loaded from cookies.yml
page . cookies . load # => true page.headers
Hash获取所有标题
Boolean设置给定标题。最终清除所有标题并设置给定标题。
Hash键值对例如"User-Agent" => "Browser" Boolean将标题添加到已经设置的标题。
Hash键值对例如"Referer" => "http://example.com" Boolean清除所有标题。
评估和返回结果给定的JS表达
String应有效JavaScriptObject您可以通过参数,尽管它应该是有效的Node或一个简单的值。 page . evaluate ( "[window.scrollX, window.scrollY]" ) 评估异步表达和返回结果
String应有效JavaScriptObject您可以通过参数,尽管它应该是有效的Node或一个简单的值。 page . evaluate_async ( %(arguments[0]({foo: "bar"})) , 5 ) # => { "foo" => "bar" } 执行表达式。不返回结果
String应有效JavaScriptObject您可以通过参数,尽管它应该是有效的Node或一个简单的值。 page . execute ( %(1 + 1) ) # => true 评估JavaScript以在页面加载之前修改事物
String应有效JavaScript browser . evaluate_on_new_document <<~JS
Object.defineProperty(navigator, "languages", {
get: function() { return ["tlh"]; }
});
JS BooleanHashStringStringStringString - 默认情况下text/javascript page . add_script_tag ( url : "http://example.com/stylesheet.css" ) # => true BooleanHashStringStringString page . add_style_tag ( content : "h1 { font-size: 40px; }" ) # => true BooleanHashBoolean ,默认情况下为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 从已加载的HTML源禁用JavaScript。您仍然可以通过evaluate或execute评估JavaScript。什么都没有返回。
page . disable_javascript 覆盖设备屏幕尺寸并模拟视口。
HashInteger ,视口宽度。 0默认情况下Integer ,视口高。 0默认情况下Float ,设备尺度因子。 0默认情况下Boolean ,是否模拟移动设备。默认情况下为false page . set_viewport ( width : 1000 , height : 600 , scale_factor : 3 ) Array[Frame] | []返回所有帧当前页面。
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . frames # =>
# [
# #<Ferrum::Frame @id="C6D104CE454A025FBCF22B98DE612B12" @parent_id=nil @name=nil @state=:stopped_loading @execution_id=1>,
# #<Ferrum::Frame @id="C09C4E4404314AAEAE85928EAC109A93" @parent_id="C6D104CE454A025FBCF22B98DE612B12" @state=:stopped_loading @execution_id=2>,
# #<Ferrum::Frame @id="2E9C7F476ED09D87A42F2FEE3C6FBC3C" @parent_id="C6D104CE454A025FBCF22B98DE612B12" @state=:stopped_loading @execution_id=3>,
# ...
# ] Frame返回页面的主框架,树的顶部和所有框架的父。
Frame | nil通过给定选项查找框架。
HashString - 浏览器提供的唯一帧的IDString - 帧的名称如果有一个 page . frame_by ( id : "C6D104CE454A025FBCF22B98DE612B12" ) String框架的独特ID。
String | nil父框架ID如果该ID嵌套在另一个中。
IntegerJS使用的执行上下文ID具有JS评估的其自身上下文。
String | nil如果给出一个名称,则应该在这里。
Symbol | nil州框架之一:
:started_loading:navigated:stopped_loadingString返回当前框架的位置HREF。
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . url # => https://interactive-examples.mdn.mozilla.net/pages/tabbed/iframe.html 返回当前帧的标题。
page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . title # => HTML Demo: <iframe> Boolean如果当前框架是页面的主框架(树的顶部)。
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . main? # => false String返回当前帧的顶部窗口位置HREF。
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_url # => "https://www.w3schools.com/tags/tag_frame.asp" String返回当前帧的顶部窗口标题。
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . current_title # => "HTML frame tag" String返回当前帧的HTML。
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
frame = page . frame_by ( id : "C09C4E4404314AAEAE85928EAC109A93" )
frame . body # => "<html><head></head><body></body></html>" 返回当前框架的医生。
page . go_to ( "https://www.w3schools.com/tags/tag_frame.asp" )
page . main_frame . doctype # => "<!DOCTYPE html>" 设置给定帧的内容。
String page . go_to ( "https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe" )
frame = page . frames [ 1 ]
frame . body # <html lang="en"><head><style>body {transition: opacity ease-in 0.2s; }...
frame . content = "<html><head></head><body><p>lol</p></body></html>"
frame . body # => <html><head></head><body><p>lol</p></body></html> 接受给定文本或默认提示的对话框(如果适用)
String 解散对话
page . on ( :dialog ) do | dialog |
if dialog . match? ( /bla-bla/ )
dialog . accept
else
dialog . dismiss
end
end
page . go_to ( "https://google.com" ) 您可以减慢或加快CSS动画的速度。
Integer返回CSS动画的播放率,默认为1 。
设置CSS动画的播放率
Integer page . playback_rate = 2000
page . go_to ( "https://google.com" )
page . playback_rate # => 2000 Boolean Frame返回当前节点的帧对象,您可以继续使用该对象的发现器:
frame = page . at_xpath ( "//iframe" ) . frame # => Frame
frame . at_css ( "//a[text() = 'Log in']" ) # => Node Boolean Array<Node> Node | nil ): Boolean (可链)通过传递属性选择选项。
page . at_xpath ( "//*[select]" ) . select ( [ "1" ] ) # => Node (select)
page . at_xpath ( "//*[select]" ) . select ( [ "text" ] , by : :text ) # => Node (select)接受字符串,数组或字符串:
page . at_xpath ( "//*[select]" ) . select ( "1" )
page . at_xpath ( "//*[select]" ) . select ( "1" , "2" )
page . at_xpath ( "//*[select]" ) . select ( [ "1" , "2" ] ) 您可以使用tracing.record创建一个可以在Chrome DevTools或Timeline Viewer中打开的跟踪文件。
page . tracing . record ( path : "trace.json" ) do
page . go_to ( "https://www.google.com" )
end String接受块,记录跟踪和默认情况下返回从Tracing.tracingComplete事件作为输出的跟踪数据。指定path时,将返回true ,并将跟踪数据存储到文件中。
HashString在磁盘上保存数据,默认nilSymbol :base64 | :binary编码输出为base64或纯文本。 :binaryFloat等到在指定的时间中文件流完成或增加错误,默认为nilBoolean捕获屏幕截图,默认为falseHash<String, Object> for trace,对于类别,请参见getCategories,每个浏览器一次只能有一个跟踪配置。 关闭浏览器实例打开的Browser选项卡。
# connect to a long-running Chrome process
browser = Ferrum :: Browser . new ( url : 'http://localhost:9222' )
browser . go_to ( "https://github.com/" )
# clean up, lest the tab stays there hanging forever
browser . reset
browser . quit Ferrum是完全螺纹安全的。您可以根据需要创建一个浏览器或一些浏览器,然后开始使用线程进行播放。下面显示了如何创建一些共享相同上下文的页面。上下文类似于隐身配置文件,但是您可以拥有多个,可以将其视为独立浏览器会话:
browser = Ferrum :: Browser . new
context = browser . contexts . create
t1 = Thread . new ( context ) do | c |
page = c . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . screenshot ( path : "t1.png" )
end
t2 = Thread . new ( context ) do | c |
page = c . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+static+typing" )
page . screenshot ( path : "t2.png" )
end
t1 . join
t2 . join
context . dispose
browser . quit或者您可以创建两个独立的上下文:
browser = Ferrum :: Browser . new
t1 = Thread . new ( browser ) do | b |
context = b . contexts . create
page = context . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+headless+driver+for+Capybara" )
page . screenshot ( path : "t1.png" )
context . dispose
end
t2 = Thread . new ( browser ) do | b |
context = b . contexts . create
page = context . create_page
page . go_to ( "https://www.google.com/search?q=Ruby+static+typing" )
page . screenshot ( path : "t2.png" )
context . dispose
end
t1 . join
t2 . join
browser . quit 查看回购后,运行bundle install以安装依赖项。
然后,运行bundle exec rake test以运行测试。您还可以运行bin/console以获得交互提示,该提示可以让您进行实验。
要将此GEM安装到本地计算机上,请运行bundle exec rake install 。要发布新版本,请在version.rb中更新版本编号,然后运行bundle exec rake release ,该版本将为版本创建一个git标签,推送git consits和创建标签,然后将.gem文件推到rubygems.org。
欢迎在GitHub上进行错误报告和拉动请求。
根据MIT许可证的条款,该宝石可作为开源。