在缓存中找不到元素 - 也许页面自从在 Selenium Ruby Web 驱动程序中查找后已发生更改?

2024-02-08

我正在尝试编写一个爬虫,它可以从加载的页面中爬取所有链接,并在某个文件(例如 XML 或 txt)中记录所有请求和响应标头以及响应正文。我正在新浏览器窗口中打开第一个加载页面的所有链接,因此不会出现此错误:

Element not found in the cache - perhaps the page has changed since it was looked up

我想知道发出请求并从所有链接接收响应,然后找到输入元素并从所有打开的窗口提交按钮的替代方法是什么。 我能够在某种程度上执行上述操作,除非打开的窗口具有像这样的通用站点搜索框http://www.testfire.net http://www.testfire.net在右上角。 我想要做的是我想省略这些常见的框,以便我可以使用值填充其他输入i.send_keys "value"webdriver 的方法,不会出现此错误 错误:在缓存中找不到元素 - 也许页面自查找以来已发生更改。

如何检测和区分每个打开的窗口中的输入标签,以便在网站大多数页面上出现的常见输入标签中不会重复填充值。 我的代码如下:

require 'rubygems'
require 'selenium-webdriver'
require 'timeout'

class Clicker
def open_new_window(url)
  @driver = Selenium::WebDriver.for :firefox
  @url = @driver.get " http://test.acunetix.com "
  @link = Array.new(@driver.find_elements(:tag_name, "a"))
  @windows = Array.new(@driver.window_handles())
  @link.each do |a|
      a = @driver.execute_script("var d=document,a=d.createElement('a');a.target='_blank';a.href=arguments[0];a.innerHTML='.';d.body.appendChild(a);return a", a)
      a.click
    end
    i = @driver.window_handles
    i[0..i.length].each do |handle|
        @driver.switch_to().window(handle)
        puts @driver.current_url()
        inputs = Array.new(@driver.find_elements(:tag_name, 'input'))
        forms = Array.new(@driver.find_elements(:tag_name, 'form'))
        inputs.each do |i|
            begin
                i.send_keys "value"
                puts i.class
                i.submit
                rescue Timeout::Error => exc
                    puts "ERROR: #{exc.message}"
                rescue Errno::ETIMEDOUT => exc
                    puts "ERROR: #{exc.message}"
                rescue Exception => exc
                    puts "ERROR: #{exc.message}"
            end
        end 
        forms.each do |j|
            begin
                j.send_keys "value"
                j.submit
                rescue Timeout::Error => exc
                    puts "ERROR: #{exc.message}"
                rescue Errno::ETIMEDOUT => exc
                    puts "ERROR: #{exc.message}"
                rescue Exception => exc
                    puts "ERROR: #{exc.message}"
            end
        end

    end
#Switch back to the original window
    @driver.switch_to().window(i[0])
end
end
ol = Clicker.new
url = ""
ol.open_new_window(url)

指导我如何使用 Selenium Webdriver 或使用获取带有响应正文的所有请求和响应标头http.set_debug_output红宝石的net/http ?


Selenium 不是尝试构建“网络爬虫”的最佳选择之一。有时它可能太不稳定,尤其是遇到意想不到的情况时。 Selenium WebDriver 是一个用于自动化和测试期望和用户交互的出色工具。 相反,良好的老式卷曲可能是网络爬行的更好选择。另外,我很确定有一些 ruby​​ gem 可以帮助您进行网络爬行,只需 Google 搜索即可!

但要回答实际问题,如果您要使用 Selenium WebDriver:

我会制定一个过滤算法,您可以将与之交互的元素的 HTML 添加到变量数组中。然后,当您转到下一个窗口/选项卡/链接时,它会检查变量数组,如果找到匹配的 HTML 值,则跳过该元素。

不幸的是,SWD 不支持使用其 API 获取请求标头和响应。常见的解决方法是使用第三方代理来拦截请求。

===========

现在我想解决您的代码的一些问题。

我建议在迭代链接之前添加一个@default_current_window = @driver.window_handle。这将允许您在调用时始终返回到脚本末尾的正确窗口@driver.switch_to.window(@default_current_window).

在 @links 迭代器中,不要迭代所有可能显示的窗口,而是使用@driver.switch_to.window(@driver.window_handles.last)。这将切换到最近显示的新窗口(并且每次单击链接只需发生一次!)。

您可以通过执行以下操作来干燥输入并形成代码:

inputs = []
inputs << @driver.find_elements(:tag_name => "input")
inputs << @driver.find_elements(:tag_name => "form")
inputs.flatten
inputs.each do |i|
  begin
    i.send_keys "value"
    i.submit
  rescue e
    puts "ERROR: #{e.message}"
  end
end

请注意我刚刚如何将您希望 SWD 查找的所有元素添加到您迭代的单个数组变量中。然后,当发生不好的事情时,需要进行一次救援(我假设您不想从那里自动退出,这就是为什么您只想将消息打印到屏幕上)。

学习干燥代码并使用外部 gem 将帮助您以更快的速度实现许多您想要做的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在缓存中找不到元素 - 也许页面自从在 Selenium Ruby Web 驱动程序中查找后已发生更改? 的相关文章

随机推荐

  • 获取数组中的第一列

    我有一张工作表 需要获取某一列的值 电子邮件地址 在本例中为 C 假设该列中有三封电子邮件 日志给了我 电子邮件1 电子邮件2 电子邮件3 为了继续执行脚本 我需要让数组看起来像这样 电子邮件1 电子邮件2 电子邮件3 所以只是没有外括号
  • Highcharts - 处理重叠区域样条点上的点击

    每次单击系列中的某个点时 我都需要获取点详细信息 但单击区域样条线重叠点不会触发 单击 事件 仅当该系列的点位于前面时才会触发 plotOptions series events click function event alert thi
  • 你好,是否可以在 Eclipse 下禁用/不显示向导

    是否可以在 Eclipse 下禁用 不显示向导 例如 文件 gt 新建 gt 向导名称同样的方法 文件 gt 新建 gt 其他 gt 选择向导 gt 向导类别名称 gt 向导名称 我可以通过 propertyTesters 使向导不显示在
  • 指南针(红宝石)编码错误

    我在 Ubuntu Oneiric 上安装了 Compass 0 12 一个 ruby gem 没有任何问题 我已经更新为精确格式化 并保留 home 所以我需要重新安装 ruby 1 9 3 现在 当我编译 SCSS 文件时 出现此错误
  • 如何创建 MSI 设置?

    多年来我一直使用 Inno Setup 为所有 Delphi 工具创建设置 现在 一些用户更想要 MSI 安装包 这样他们就可以将安装程序从中央服务器部署到所有工作站 我如何创建一个 我必须购买 Visual Studio 或其他产品吗 您
  • QTP:如何从函数返回多个值

    我正在尝试编写一个函数 它可以从具有 2 个参数的函数返回多个值 eg function sample function arg1 arg2 Some code passenger list1 0 name1 list1 1 age1 li
  • Mac X11 有 XTEST 扩展吗?

    所以我把一些 X 程序移到了 mac 上 然后我得到了 Error XTEST extension unavailable on null 来自 xdotool OS X X11 是否附带 XTEST 如果没有的话有办法添加吗 在终端中运行
  • WiX 自定义许可证文件:安装程序显示带有 < > 的链接

    我创建了一个带有自定义许可证文件的 WiX 3 5 设置 将其放入 wxs file
  • 无法安装 Facebook 6.4.2 软件包

    我正在尝试安装 facebook C sdkNuGet 控制台进入我的视窗电话 8 app NET框架4 0但它给出了一个错误 详细信息如下 PM gt Install Package Facebook Successfully insta
  • 从 itertools.cycle 中提取列表

    我有一堂课 其中包含itertools cycle我希望能够复制的实例 一种方法 我能想到的唯一方法 是提取初始可迭代对象 这是一个列表 并存储循环所在的位置 不幸的是 我无法获取用于创建循环实例的列表 似乎也没有明显的方法来做到这一点 i
  • 使用 Encode::encode 和“utf8”

    正如您可能知道的 在 Perl 中 utf8 意味着 Perl 对 UTF 8 的宽松理解 它允许在技术上不是 UTF 8 中有效代码点的字符 相比之下 UTF 8 或 utf 8 是 Perl 对 UTF 8 更严格的理解 它不允许无效的
  • 一条 SQL 语句中存在多个 WHERE 条件

    我无法使用很多WHERE条件 因为我确实需要结合8 Where单个语句中的条件 我当前的SQL SELECT FROM Table WHERE ID I want 某物像这样 SELECT FROM Table WHERE ID WHERE
  • 同时更新两个表的条​​件 SQL 语句

    我想一次更新两个表 下面的代码似乎工作正常 但是 在某些情况下 bidGroups 中没有条目 这意味着整个语句将失败 我怎样才能调整它 以便它更新第一位 watchedItems 并且如果watchedItems bidGroupID I
  • 错误:xcode-select:错误:工具“xcodebuild”需要 Xcode

    我在用Ionic 2 该应用程序构建了一个Androidapk在 Windows 上成功 我现在正在尝试构建它iOS在 OSX 上 当我跑步时 ionic build ios 我得到以下信息 任何建议表示赞赏 你需要配置xcode安装后 打
  • WCF REST 缓存 - 客户端和服务器端

    我写了一个 RESTful WCF 服务 合并 ETag 使标头过期 从浏览器使用它时 缓存效果很好 但是 当从 WCF 通道工厂或 NET Web 请求对象调用缓存时 缓存是如何工作的呢 因此 在我的网站在返回 304 未修改响应时调用
  • 之间有什么区别?

    当我使用
  • 使用 mongoimport 导入超过 1 个 json 文件

    我是新来的mongodb并想了解如何导入json文件从一台服务器传输到另一台服务器 我尝试了以下命令mongoimport d test c bik check json它对我来说效果很好 现在我想知道什么时候有多个json我如何一次性导入
  • 页面加载时 Twitter 引导程序进度条动画

    我有一个带有几个引导进度条的页面 最初设置它们的值效果很好 虽然我希望进度条在用户打开页面时动画 转换到其特定状态 当你点击其中一个栏时 这个 JS 工作正常 我在酒吧的 onload 事件中需要类似的东西 但 onload 事件不适用于
  • 无法让社交媒体共享按钮在内联列表中排列

    在我的一生中 我无法让这些社交媒体分享按钮与我的内嵌列表对齐 我差点就拥有了它vertical align top on the li 但 Chrome 不喜欢这样 页面可以在这里看到 http 206 72 114 49 sharelin
  • 在缓存中找不到元素 - 也许页面自从在 Selenium Ruby Web 驱动程序中查找后已发生更改?

    我正在尝试编写一个爬虫 它可以从加载的页面中爬取所有链接 并在某个文件 例如 XML 或 txt 中记录所有请求和响应标头以及响应正文 我正在新浏览器窗口中打开第一个加载页面的所有链接 因此不会出现此错误 Element not found