我想在使用driver.get "http://www.example.com"
加载的页面中打开新浏览器标签中的所有点击链接。我在之前问过的其他问题中得到了答案,但它没有按照我的预期工作。
代码如下:
require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.get " http://www.testfire.net "
driver.find_elements(:tag_name, "a").each {|link| link.click }
运行此代码后,Selenium Web Driver会打开Firefox,加载请求的页面并点击它找到的第一个锚标记,然后崩溃并显示错误。
我也试过这个driver.find_element(:tag_name, "a").send_keys [:control,'t']
这个打开新标签但没有加载页面,空白标签。
如何在循环中安排此操作,以便我不会收到错误,第一个加载页面上的所有点击链接将在单独的浏览器标签中打开?
我是否需要使用wait
来实现此目的?
[remote server] resource://fxdriver/modules/web_element_cache.js:9500:in `unknown': Element not found in the cache - perhaps the page has changed since it was looked up (Selenium::WebDriver::Error::StaleElementReferenceError)
from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:9069:in `unknown'
from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:9504:in `unknown'
from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:10510:in `unknown'
from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:10529:in `unknown'
from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:10534:in `unknown'
from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:10482:in `unknown'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/http/default.rb:64:in `request'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/bridge.rb:594:in `raw_execute'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/bridge.rb:572:in `execute'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/bridge.rb:354:in `clickElement'
from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/common/element.rb:34:in `click'
from selclick.rb:6:in `block in <main>'
from selclick.rb:5:in `each'
from selclick.rb:5:in `<main>'
答案 0 :(得分:1)
我相信这是“按预期工作。”
循环的第一次迭代正常工作,然后每次循环失败。原因完全由错误给出。由于页面已重新加载,因此对象引用不再指向正确的链接。
我不确定这是否清楚,所以让我们完全了解最新情况。
您访问了自己的网页。所有链接都以数组形式收集。在循环的第一次迭代中,单击第一个链接。您访问的链接只是同一页面。您不再在以前的页面上。循环的第二次迭代查找上一页的链接。它不在了,因为你在下一页。因此,错误。
你想要完成的是什么?您是否尝试访问该网站的每个页面?
如果您尝试抓取该网站,我可以推荐使用Mechanize或Anemone吗?
答案 1 :(得分:1)
Java
List<WebElement> elements = driver.find_elements( _locator_ );
for (i=0; i<elements.size(); i++) {
List<WebElement> elements2 =driver.find_elements(_locator_)
WebElement ele = elements2.get(i);
ele.click();
}