【问题标题】:Selenium 1 to Selenium 2 MigrationSelenium 1 到 Selenium 2 迁移
【发布时间】:2011-08-07 05:21:30
【问题描述】:

过去几个月,Selenium 2 一直处于测试阶段。我想知道我们中的任何人是否已经从 selenium 1 分析/迁移到 selenium 2

  1. 为了适应 2 个功能,在更改# 方面所涉及的工作量是多少。方法/API 更改#
  2. 就 Selenium 2 中的测试运行时间而言,性能改进了多少
  3. 任何最佳实践/学习分享都会很有用

【问题讨论】:

    标签: testing selenium automation webdriver selenium-webdriver


    【解决方案1】:

    我自己正在经历过渡。如果你有过 Selenium 1 的经验,Selenium 2 实际上感觉完全不同。这是我目前看到的 Selenium 2 与 Selenium 1 的优缺点(我使用 Python,所以其中一些是 Python 特有的):

    优点:

    • 快得多。
    • 无需运行单独的服务器。
    • wait_for_page_to_load()、wait_for_element_present() 等已不复存在。所有元素交互、点击等现在都被阻止,这很好。唯一的问题是异步加载的内容 (Ajax),请参阅下面的 Con。

    缺点:

    • 现在使用 wait_for_page_to_load() 加载/等待以前“免费”的异步内容需要编码。这些是我到目前为止找到的解决方案:
      • 使用 PageFactory/AjaxElementLocatorFactory 就像解释 here,不幸的是我找不到 Python 的等效项。
      • 使用 webdriver.implicitly_wait(N),这似乎是用 Python 做的伎俩,但使用它似乎会导致我的脚本错过它以前检测到的更改元素。
      • 不要执行 sleep(T)、循环直到元素出现等,这违背了整个事情的目的(并使 wait_for_page_to_load 看起来很漂亮)...
    • 整个事情仍然感觉有点生硬。不同的驱动程序和绑定似乎缺少不同的功能。并不是说您不能使用它,而是准备为某些问题找到“替代解决方案”。
    • 文档有点可疑(我猜与前一点有关)。特别是对于 Python。准备好阅读代码并进行大量实验(幸运的是,这对 Python 来说很容易)。您可以在网络上找到的大多数“教程”(同样,尤其是 Python、Java 似乎覆盖得更好)只是为了让您开始使用最简单的网络应用程序。
    • 没有 PHP 绑定,不是很大。我更喜欢 Python,但我们最初的套件是 PHP,所以我注意到了。
    • SeleniumIDE 似乎对 Selenium 2 无用。

    其他区别:

    • 当您要求 selenium 查找它们时,您正在访问的页面元素必须在页面上“可见”。例如,如果您有一个菜单(包含链接列表),当您将鼠标悬停在其上时,您必须确保它是打开/可见的,然后再单击其中的链接(Selenium 1 中不是这种情况) )。这很有用,因为您将测试用户将在页面上看到的内容,但需要额外的代码。我找到了两个解决方案:
      • 运行一个Javascript来打开你的菜单,在我的例子中是driver.execute_script("document.getElementById('dashboard_menu_navigation').show()")然后点击菜单项driver.find_element_by_link_text('Orders').click()
      • 使用鼠标/键盘类来模拟实际交互,但这似乎在 Python 绑定中被破坏了(参见上面的缺点):

    示例(今天抛出 'WebElement' object has no attribute 'mouse_move_to'):

    element=driver.find_element_by_id('mn_dashboard')
    mouse=Mouse()
    mouse.move_to(element)
    

    缺点列表似乎更长,但主要是如果您来自 Selenium 1。我确实更喜欢 Selenium 2 的轻便和速度,尽管代码很早(在撰写本文时使用 2.0b4),但整个事情是相当不错的可用。

    希望能节省一些时间...

    【讨论】:

      【解决方案2】:

      从 Selenium 1 迁移到 Selenium 2 就像迁移一样简单

      Selenium selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.example.com");
      selenium.open("/");
      

      Webdriver driver = new FirefoxDriver();
      Selenium selenium = new WebDriverBackedSelenium(driver, "http://www.example.com");
      selenium.open("/");
      

      由于 Selenium 2 与浏览器的绑定更加紧密,您将看到巨大的差异。我看到测试的运行速度至少快了 2 倍,但在某些情况下我看到它的运行速度快了 4 倍。

      您在 Selenium 中学到的所有相同最佳实践都将被翻译

      【讨论】:

      • 假设您使用的是 Java。 WebDriverBackedSelenium 是否可用于其他语言绑定?
      • 是的,它适用于所有语言,因为工作是在服务器上完成的,而不是在客户端绑定中
      【解决方案3】:

      【讨论】:

        【解决方案4】:

        您可以使用 WebDriverBackedSelenium 类将 WebDriver 接口转换为 Selenium 接口:

        Selenium selenium = new WebDriverBackedSelenium(webDriver, baseUrl);

        或者你可以使用getUnderlyingWebDriver()方法将Selenium接口转换为WebDriver接口:

        WebDriver webDriver = ((WebDriverBackedSelenium)selenium).getUnderlyingWebDriver();
        

        我在此处发布了我最近关于如何开始使用 Selenium 2 的演示文稿之一的幻灯片:

        http://www.slideshare.net/sebarmeli/getting-started-with-selenium-2
        

        Selenium 2 中的最佳实践之一是 PageObject 模式。

        如果您使用 Java 和 Maven,您可能想查看这个 Archetype 插件(它也让您第一次体验 PageObject 模式):

        https://github.com/sebarmeli/Selenium2-Java-QuickStart-Archetype
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-04
          • 2017-08-23
          • 1970-01-01
          相关资源
          最近更新 更多