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

Posted

技术标签:

【中文标题】如何使用硒浏览整个网站?【英文标题】:How to browse a whole website using selenium? 【发布时间】:2014-08-07 02:39:58 【问题描述】:

是否可以使用 selenium 浏览给定 URL(网站)的所有 URI? 我的目标是使用 selenium 和我选择的给定 URL 启动 firefox 浏览器(感谢这个网站,我知道该怎么做),然后让 firefox 浏览 URL(网站)拥有的所有页面。我感谢任何有关如何在 Python 中执行此操作的提示/帮助。

【问题讨论】:

您真的需要关注网站上的所有链接吗?动机是什么?您想从网站中获取什么样的数据?网站是否允许进行网络爬取?它提供 API 吗?指向不同域的外部链接呢?为什么需要真正的浏览器(selenium)?谢谢。 “浏览整个网站”在这里意味着什么?您是只寻找 html,还是需要 javascript、CSS、图像、字体和下载?您希望如何与 Python 中的这个“超级爬虫”进行交互?换句话说:你想在这里解决什么问题? 我相信 Selenium 不适合做这件事。 Selenium 旨在为您提供通过 UI 执行自动化测试的能力。如果您需要爬虫,请至少查看portent.com/blog/random/python-web-crawler-code.htm 或自己编写。 @olyv 但我的最终目标是让 firefox 在给定网站 (URL) 的所有页面 (URI) 中运行:您认为有比 selenium 更好的工具吗?跨度> @begueradj 另一种方法是编写一些 javascript 代码,然后将其保存到书签中。 【参考方案1】:

您可以在如下所示的类中使用递归方法来执行此操作。

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

希望对你有所帮助。

【讨论】:

我猜你已经用 Java 编写了它。我会试着把它翻译成 Python。 它在 java 中工作正常。访问网站中的所有链接。 这个程序也计算到网站的外部链接。我怎样才能避免这种情况?我想浏览同一个网站的所有页面,没有外部链接。 假设网站中的所有内部链接都遵循相同的模式,您可以设置一个条件来阻止代码点击外部链接。例如:如果您的网站是example.com,那么您的内部链接将在其网址中具有相同的内容。希望对你有帮助 这不是java 的问题。 OP询问python中编写的解决方案。【参考方案2】:

正如 Khyati 所提到的,但是 selenium 可能不是网络爬虫或机器人。您必须知道要测试的位置/内容。

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

虽然如果你沿着这条路走,并且有一个页面打开另一个页面然后有一个返回链接,你会想要保留所有访问过的 URL 的列表,并确保你不会复制这样的页面。

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

【讨论】:

【参考方案3】:

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

这是javascript中的代码:

describe( '*** 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://***.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克隆repo

注意:我知道量角器可能不是最好的工具,但使用它非常简单,我只是试了一下。

我使用 firefox(您可以使用 firefox-conf 分支,但它需要您手动触发 webdriver)和 chrome 对此进行了测试。如果您使用的是 osx,这应该没有问题(假设您安装了 nodejs)

【讨论】:

【参考方案4】:

Selenium API 提供了所有工具,您可以通过这些工具执行各种操作,例如 type 、click 、 goto 、 navigateTo 、在帧之间切换、拖放等。 如果我理解正确的话,您的目标只是简单地浏览,点击并在网站内提供不同的网址。是的,你绝对可以通过 Selenium webdriver 做到这一点。 并且您可以制作一个属性文件,以便更好地方便和准备,您可以在其中传递不同的属性,如 URL、Base URI 等,并在不同的浏览器中通过 Selenium Webdriver 进行自动化测试。

【讨论】:

我可以使用selenium 检测给定 URL 中的 URI(如您所说的浏览)吗?【参考方案5】:

这是可能的。我已经使用 Java webdriver 和 URI 实现了这一点。这主要是为了识别损坏的链接。

使用带有标签的“getElements”可以使用webdriver一旦打开并保存“href”值。

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

然后从堆栈中弹出链接并使用 Webdriver “获取”链接。再次从页面中获取所有链接,删除堆栈中存在的重复链接。

循环直到堆栈为空。

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

如果您在实施中遇到困难,请发表评论。

【讨论】:

如果我通过get 使用每个URI 启动firefox,firefox 不会冻结并且不会响应? @begueradj 您没有初始化/启动浏览器,您只是在浏览器中打开网址,然后使用页面获取网址。 我的目标是Firefox浏览URL的所有URI @begueradj 浏览意味着在浏览器中打开 - 因此打开 URL 的过程与浏览网站类似,因为我们是从网页中获取 URL,而不是直接添加。一旦尝试实施这种方法,如果您有任何不同的要求,请告诉我。

以上是关于如何使用硒浏览整个网站?的主要内容,如果未能解决你的问题,请参考以下文章

如何分析每个单独的硒测试?

硒;如何运行多个实例并维护不同的会话

如何使用硒在网页上查找具有特定文本的所有输入元素

如何使用硒网络驱动程序中的ruby脚本在chrome中打开新标签[重复]

如何从硒网站上获取时间?

尝试运行脚本时如何解决mac上的硒问题