2016-08-12 1 views
1

Ich habe diese Methode erstellt, um die Links in einem bestimmten div auf der Website durchlaufen. Mein Ziel der Methode ist es, die Links zu sammeln, sie in ein Array einzufügen und dann auf jedes einzelne zu klicken.Ruby Watir - Versuchen, Links in cnn.com zu durchlaufen und klicken Sie auf jede von ihnen

require 'watir-webdriver' 
require 'watir-webdriver/wait' 

site = Watir::Browser.new :chrome 
url = "http://www.cnn.com/" 
site.goto url 

    box = Array.new 
    container = site.div(class: "column zn__column--idx-1") 
    wanted_links = container.links 


    box << wanted_links 
    wanted_links.each do |link| 
    link.click 
    site.goto url 
    site.div(id: "nav__plain-header").wait_until_present 
    end 

site.close 

Bisher scheint es, wie ich nur in der Lage bin auf dem ersten Link klicken, um dann eine Fehlermeldung erhalten, die besagt dies:

unable to locate element, using {:element=>#<Selenium::WebDriver::Element:0x634e0a5400fdfade id="0.06177683611003881-3">} (Watir::Exception::UnknownObjectException) 

Ich bin sehr neu in Ruby. Ich schätze jede Hilfe. Vielen Dank.

Antwort

1

Das Problem ist, dass sobald Sie zu einer anderen Seite navigieren, alle Elementverweise (dh die in wanted_links) veraltet werden. Selbst wenn Sie auf dieselbe Seite zurückkehren, weiß Watir/Selenium nicht, dass es sich um die gleiche Seite handelt und weiß nicht, wo sich die gespeicherten Elemente befinden.

Wenn Sie weg navigieren, müssen Sie zuerst alle Daten sammeln, die Sie benötigen. In diesem Fall benötigen Sie nur die Werte href.

# Collect the href of each link 
wanted_links = container.links.map(&:href) 

# You have each page URL, so you can navigate directly without returning to the homepage 
wanted_links.each do |link| 
    site.goto url 
end 

Für den Fall, dass die Links zu einer Seite nicht direkt navigieren (zB sie JavaScript ausführen, wenn darauf geklickt), müssen Sie genügend Daten sammeln, später die Elemente neu zu lokalisieren. Was Sie als Locator verwenden, hängt davon ab, was als statisch/eindeutig bekannt ist. Als Beispiel nehme ich an, dass der Linktext ein guter Locator ist.

# Collect the text of each link 
wanted_links = container.links.map(&:text) 

# Iterate through the links 
wanted_links.each do |link_text| 
    container = site.div(class: "column zn__column--idx-1") 
    container.link(text: link_text).click 

    site.back 
end 
+0

Das war großartig. Danke für die Info @Justin Ko – Haftah

+0

Hey Justin Ich habe diese Methode auch versucht, aber ich bekomme immer noch eine Fehlermeldung "undefined Methode' klicken '". Hier ist die Methode im nächsten Kommentar. Danke – Haftah

+0

‚require 'watir-WebDriver watir-WebDriver/wait ' site = Watir :: Browser.new' require': chrom url = "http://www.cnn.com/" site.goto url Container = site.div (Klasse: "Spalte zn__column - IDX-1") wanted_links = container.links.collect (&: text) puts wanted_links wanted_links [1] .click‘ – Haftah

Verwandte Themen