【问题标题】:Save image with watir-webdriver使用 watir-webdriver 保存图像
【发布时间】:2013-09-13 10:40:33
【问题描述】:

如何保存通过 watir-webdriver 加载的图像?所有手册和示例仅显示获取图像的 src,并使用 open-uri 保存它。但我需要保存该图像,该图像是在我的页面加载时生成的。我怎样才能做到这一点?

我可以同时使用 watir 和 watir-webdriver 吗?例如:

require 'watir-webdriver'
require 'watir'
@driver = Watir::Browser.new :firefox
@driver.goto (@base_url)
@img = @driver.image(id: 'CaptchaImage').save("2131.png")

我怎么能做这样的事情?或者如何从缓存中获取?

有人可以帮我吗?

【问题讨论】:

  • 您是否偶然尝试编写一个试图绕过验证码的机器人?
  • @AbeHeward 是的,但这仅用于测试目的)
  • @AbeHeward 那么你怎么看?
  • 我认为大多数程序员在帮助人们绕过验证码的技术时都会遇到问题。
  • @AbeHeward 绕过是不好的)我只需要测试我们的服务超载...也许 watir 是个坏主意

标签: ruby watir watir-webdriver


【解决方案1】:

OpenURI 会帮助你..

require "watir-webdriver"
require "open-uri"

b = Watir::Browser.new :chrome
b.goto "http://stackoverflow.com/"

File.open("target_file.jpg", 'wb') do |f|
 f.write open(b.img(:class, "sponsor-tag-img").src).read
end

希望你没有做坏事.. :)

如果有帮助请告诉我。

【讨论】:

  • 它对图像有帮助,但对我的验证码没有帮助,取决于 cookie)但这不是你的问题)
  • 是的,试试 tesseract-ocr :)
【解决方案2】:
require 'watir-webdriver'

如果你经常这样做,你可以扩展 Watir 的 Image 类:

Watir::Image.class_eval do

    def save path_to_new_file
          #so that src can be opened without raising: 
          #Errno::ENOENT: No such file or directory @ rb_sysopen
        require 'open-uri' 

        open(path_to_new_file, 'wb') do |file|
          file << open(src).read
        end
    end

end

所以可以这样使用:

browser = Watir::Browser.start 'google.com'
image = browser.img
image.save 'our_images/hi.png'

【讨论】:

    【解决方案3】:

    根据 watir-webdriver 文档,没有 Image#save 方法,因为它还没有实现。

    另一方面,watir-classic 确实有一个Image#save 方法。这是 rdoc 中的示例:

    browser.image.save("c:/foo/bar.jpg")
    

    【讨论】:

    • 但是 watir-classic 不支持 chrome ff 等
    • 好吧,我无法反驳。除了经典解决方案之外,您还可以查看 net/httpmechanize,它们具有在 Page 类中访问图像的方法。
    【解决方案4】:

    事实证明,这比应有的难度要小,但我需要完成此操作,因为只有在设置了有效的会话 cookie 时才能访问图像。这就是我最终设法做到这一点的方式:

    1.安装 watir-extensions-element-screenshot

    https://github.com/ansoni/watir-extensions-element-screenshot
    你可能想做gem install watir-extensions-element-screenshot

    2。调整浏览器窗口大小

    这也适用于无头 phantomJS。初始化浏览器后,将窗口大小设置为较大的值,以防止图像大于浏览器窗口时发生错误。

    browser = Watir::Browser.new :phantomjs
    browser.window.resize_to(1900, 1080)
    

    3.获取图片元素并截图

    就我而言,整个网站都是一张图片。幸运的是,browser.html 确实表明图像仍然封装在 &lt;img&gt; 标记中,因此我们可以像这样访问图像(在本例中是页面上的所有图像):

    browser.elements( :tag_name => "img" ).each do |x|
        x.screenshot("file_name.png")
    end
    

    这会将图像保存到file_name.png。这不是完全相同的文件,而是它的屏幕截图。但就图片下载而言,这对我来说是一个完美的解决方案,希望对其他人也是如此!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      相关资源
      最近更新 更多