如何使用selenium浏览整个网站?

时间:2014-06-17 07:16:05

标签: python firefox selenium selenium-webdriver web-scraping

是否可以使用selenium浏览给定网址(网站)的所有URI?

我的目标是使用我所选择的给定URL的selenium启动firefox浏览器(我知道如何通过这个网站做到这一点),然后让firefox浏览URL(网站)拥有的所有页面。我很感激有关如何在Python中使用它的任何提示/帮助。

5 个答案:

答案 0 :(得分:4)

您可以在类中使用递归方法(例如下面给出的方法)来执行此操作。

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();
    }
}

希望这会对你有所帮助。

答案 1 :(得分:2)

然而,正如Khyati提到的那样,硒可能不是一个摄像头或机器人。您必须知道您要测试的位置/内容。

如果您真的想沿着这条路走下去,我建议您点击页面,将所有元素拉回来,然后循环浏览以点击任何与导航功能相对应的元素(即“// a”或超链接点击)

虽然如果沿着这条路走下去并且有一个页面打开另一个页面,然后有一个链接回来,你会希望保留所有访问过的URL的列表,并确保你不复制这样的页面。 / p>

这样可行,但也需要一些逻辑来实现它......如果你不小心,你可能会发现自己陷入无限循环。

答案 2 :(得分:0)

Selenium API提供了所有工具,您可以通过它来执行各种操作,如类型,单击,转到,导航,在帧之间切换,拖放等。 如果我理解正确的话,你打算做的只是简单地浏览,点击并在网站内提供不同的URl。呀,你绝对可以通过Selenium webdriver来做到这一点。 你可以制作一个属性文件,以便更好地轻松准备,你可以在其中传递不同的属性,如URL,基本URI等,并通过Selenium Webdriver在不同的浏览器中进行自动化测试。

答案 3 :(得分:0)

这是可能的。我已经使用Java webdriver和URI实现了这一点。这主要是为了识别断开的链接而创建的。

使用&#34; getElements&#34;有标签可以使用webdriver一旦打开并保存&#34; href&#34;值。

使用java的URL类检查所有链接状态并将其放入堆栈。

然后从堆栈弹出链接和&#34;得到&#34;使用Webdriver链接。再次从页面中获取所有链接,删除堆栈中存在的重复链接。

循环直到堆栈为空。

您可以根据自己的要求进行更新。例如遍历的级别,不包括没有给定网站域名的其他链接等。

如果您发现实施有困难,请发表评论。

答案 4 :(得分:0)

我知道你要求一个python示例,但我正在设置一个简单的rep o进行量角器测试,你想完成的任务似乎很容易用量角器(这只是一个包装webdriver)

这是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();

    } );
  } );

} );

您可以从here

克隆回购

注意:我知道量角器可能不是最适合它的工具,但用它来做它很简单,我只是试一试。

我用firefox测试了这个(你可以使用firefox-conf分支,但它需要你手动启动webdriver)和chrome。如果您正在使用osx,这应该没有问题(假设您安装了nodejs)