2014-06-17 6 views
7

Ist es möglich, alle URIs einer bestimmten URL (Website) mit selenium zu durchlaufen?

Mein Ziel ist es, Firefox Browser mit Selen mit einer bestimmten URL meiner Wahl zu starten (Ich weiß, wie es dank dieser Website zu tun), und dann Firefox alle Seiten durchsuchen, die URL (Website) hat. Ich schätze jeden Hinweis/Hilfe, wie man es in Python macht.Wie kann man eine ganze Website mit Selen durchsuchen?

+2

Sie müssen wirklich alle Links auf einer Website folgen? Was ist die Motivation? Welche Art von Daten möchten Sie von der Website erhalten? Ist Web-Crawling für die Website erlaubt? Bietet es eine API? Was ist mit externen Links zu verschiedenen Domains? Warum brauchst du einen echten Browser (Selen)? Vielen Dank. – alecxe

+0

Und was bedeutet "eine ganze Website durchsuchen" sogar hier? Suchen Sie nur nach HTML oder benötigen Sie auch JavaScript, CSS, Bilder, Schriftarten und Downloads? Wie erwartest du mit diesem 'Super Crawler' von Python zu interagieren? Mit anderen Worten: Welches Problem versuchen Sie hier zu lösen? –

+1

Ich glaube, Selen ist kein geeignetes Werkzeug dafür. Selenium soll Ihnen die Möglichkeit bieten, automatisierte Tests über die Benutzeroberfläche durchzuführen. Wenn Sie einen Crawler benötigen, werfen Sie einen Blick auf http://www.portent.com/blog/random/python-web-crawler-code.htm oder schreiben Sie Ihren eigenen. – olyv

Antwort

4

Sie können eine rekursive Methode in einer Klasse wie der folgenden verwenden, um dies zu tun.

public class RecursiveLinkTest { 
    //list to save visited links 
    static List<String> linkAlreadyVisited = new ArrayList<String>(); 
    WebDriver driver; 

    public RecursiveLinkTest(WebDriver driver) { 
     this.driver = driver; 
    } 

    public void linkTest() { 
     // loop over all the a elements in the page 
     for(WebElement link : driver.findElements(By.tagName("a")) { 
      // Check if link is displayed and not previously visited 
      if (link.isDisplayed() 
         && !linkAlreadyVisited.contains(link.getText())) { 
       // add link to list of links already visited 
       linkAlreadyVisited.add(link.getText()); 
       System.out.println(link.getText()); 
       // click on the link. This opens a new page 
       link.click(); 
       // call recursiveLinkTest on the new page 
       new RecursiveLinkTest(driver).linkTest(); 
      } 
     } 
     driver.navigate().back(); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     WebDriver driver = new FirefoxDriver(); 
     driver.get("http://newtours.demoaut.com/"); 
     // start recursive linkText 
     new RecursiveLinkTest(driver).linkTest(); 
    } 
} 

Hoffe das hilft Ihnen.

+1

Ich denke, Sie haben es in Java programmiert. Ich werde versuchen, es in Python zu übersetzen. –

+2

funktioniert es in Java in Ordnung. besucht alle Links auf der Website. – Sighil

+0

Dieses Programm zählt auch die externen Links zur Website. Wie kann ich das vermeiden? Ich möchte alle Seiten der gleichen Website durchsuchen, kein externer Link. –

0

Selen API bietet alle Möglichkeiten, über die Sie verschiedene Operationen wie type, click, goto, navigateTo, wechseln zwischen Frames, Drag & Drop, etc. Was Sie tun wollen, ist nur in einfachen Begriffen Browsing, klicken und andere URLs innerhalb der Website auch bereitstellen, wenn ich richtig verstanden habe. Ja, Sie können es definitiv über Selenium webdriver tun. Und Sie können eine Eigenschaft Datei, für eine bessere Leichtigkeit und Bereitschaft, wo-in können Sie verschiedene Eigenschaften wie URLs, Base URI, etc. und machen die Automatisierung Tests über Selenium Webdriver in verschiedenen Browsern.

+0

Kann ich mit 'Selen' die URIs innerhalb einer bestimmten URL erkennen (Browsing, wie Sie gesagt haben)? –

2

Wie Khyati erwähnt, ist es jedoch möglich, Selen nicht ein Webcrawler oder Roboter. Sie müssen wissen, wo/was Sie versuchen zu testen.

Wenn Sie wirklich diesen Weg gehen wollen, würde ich empfehlen, dass Sie die Seite drücken, ziehen Sie alle Elemente zurück und dann durch Klicken auf Elemente, die Navigationsfunktion entsprechen würde (zB "// a" oder Hyperlink klicken).

Obwohl, wenn Sie diesen Pfad gehen und es eine Seite gibt, die eine andere Seite öffnet, dann einen Link zurück hat, möchten Sie eine Liste aller besuchten URLs behalten und sicherstellen, dass Sie eine Seite nicht so duplizieren.

Das würde funktionieren, aber würde auch ein bisschen Logik erfordern, damit es passiert ... und Sie könnten sich in einer Endlosschleife finden, wenn Sie nicht vorsichtig sind.

+0

Danke. Es scheint schwierig ... –

0

Dies ist möglich. Ich habe dies mit Java-Webdriver und URI implementiert. Dies wurde hauptsächlich erstellt, um die fehlerhaften Links zu identifizieren.

Verwenden Sie "getElements" mit Tag kann mit Webdriver erhalten einmal geöffnet und speichern "href" -Wert.

Überprüfen Sie alle Link-Status mit URL-Klasse von Java und legen Sie es im Stapel.

Dann Pop-Link vom Stapel und "Get" Link mit Webdriver. Erneut alle Links von der Seite entfernen doppelte Links, die im Stapel vorhanden sind.

Wiederholen Sie dies, bis der Stapel leer ist.

Sie können es gemäß Ihren Anforderungen aktualisieren. Wie die Ebenen des Traversierens, ausgenommen andere Links, die keine Domain der gegebenen Website usw. haben.

Bitte kommentieren Sie, wenn Sie Schwierigkeiten bei der Implementierung haben.

+0

Wenn ich Firefox mit jedem URI durch "Get" starte, würde Firefox nicht einfrieren und nicht antworten? –

+0

@begeradj Sie initialisieren den Browser nicht, Sie öffnen nur die URL im Browser und verwenden dann die Seite, um die URLs zu erhalten. – lAH2iV

+0

Mein Ziel ist es, dass firefox alle URIs der URL durchsucht –

0

Ich weiß, dass Sie nach einem Python-Beispiel gefragt haben, aber ich war gerade dabei, einen einfachen Repo für Winkelmessertests zu erstellen und die Aufgabe, die Sie ausführen wollen, scheint mit Winkelmesser sehr einfach zu sein (was einfach ist ein Wrapper um WebDriver)

hier ist der Code in Javascript:

describe('stackoverflow scrapping', function() { 
    var ptor = protractor.getInstance(); 

    beforeEach(function() { 
    browser.ignoreSynchronization = true; 
    }); 

    afterEach(function() { 

    }); 

    it('should find the number of links in a given url', function() { 
    browser.get('http://stackoverflow.com/questions/24257802/how-to-browse-a-whole-website-using-selenium'); 

    var script = function() { 
     var cb = arguments[ 0 ]; 
     var nodes = document.querySelectorAll('a'); 
     nodes = [].slice.call(nodes).map(function (a) { 
     return a.href; 
     }); 
     cb(nodes); 
    }; 

    ptor.executeAsyncScript(script).then(function (res) { 
     var visit = function (url) { 
     console.log('visiting url', url); 
     browser.get(url); 
     return ptor.sleep(1000); 
     }; 

     var doVisit = function() { 
     var url = res.pop(); 
     if (url) { 
      visit(url).then(doVisit); 
     } else { 
      console.log('done visiting pages'); 
     } 
     }; 

     doVisit(); 

    }); 
    }); 

}); 

Sie die repo von here

Hinweis klonen: ich weiß Winkelmesser wahrscheinlich nicht das beste Werkzeug ist, aber es war so einfach Ich mache es damit, dass ich es einfach versuche.

Ich habe dies mit Firefox getestet (Sie können die firefox-conf Zweig dafür verwenden, aber es wird erfordern, dass Sie Webdriver manuell auslösen) und Chrom. Wenn Sie osx verwenden, sollte dies ohne Probleme funktionieren (vorausgesetzt, Sie haben nodejs installiert)

Verwandte Themen