【问题标题】:How to get the Mink Selenium 2 Driver to wait for the page to load with Behat如何使用 Behat 让 Mink Selenium 2 驱动程序等待页面加载
【发布时间】:2019-03-29 01:13:50
【问题描述】:

我正在从 Behat 2.x 系列升级到 Behat 3.x 系列。在之前的版本中,我可以加载 Selenium 1 驱动程序,该驱动程序附加到 PhantomJS 以执行测试。当我这样做时,我能够连接到一个名为 waitForPageToLoad() 的函数。

此功能由 php-selenium(来自 Alexandre Salomé)提供。它连接到 selenium 并以相同的名称调用驱动程序操作。这非常适合确保 Selenium 等待页面加载。至少在达到超时之前。它使测试变得更快。

问题在于 Selenium 1 驱动程序与 Behat 3.x 不兼容。看起来它几乎已经被放弃了,我在 Selenium 2 的 Mink 驱动程序中看不到该功能。

有没有人知道使用 Behat 3.x 和 Selenium 2 进行这项工作的方法?

【问题讨论】:

    标签: php selenium phantomjs behat mink


    【解决方案1】:

    使用 Selenium(或任何其他驱动程序),我不必担心页面是否已加载,但有一个例外:如果页面完成加载,则通过 AJAX 加载更多内容。

    要处理这个问题,您可以使用 Behat 手册中记录的自旋函数。

    http://docs.behat.org/en/v2.5/cookbook/using_spin_functions.html

    这样做的好处是:

    • 它不需要您使用 selenium 驱动程序(例如,如果您想要速度胜过外观,您可以使用 PhantomJS)。
    • 如果您停止使用 jQuery 并切换到其他东西(例如 Angular 的 $httpProvider),它不会中断

    不过,我不会使用他们的,回溯已损坏,无论如何,谁想在检查之间等待一秒钟。 :)

    试试这个:

    假设您使用的是Mink Context(感谢Mick),您可以简单地每隔一秒左右检查一次页面,直到需要 文本已经出现或消失,或者给定的超时已过期,在这种情况下我们会假设失败。

    /**
     * @When I wait for :text to appear
     * @Then I should see :text appear
     * @param $text
     * @throws \Exception
     */
    public function iWaitForTextToAppear($text)
    {
        $this->spin(function(FeatureContext $context) use ($text) {
            try {
                $context->assertPageContainsText($text);
                return true;
            }
            catch(ResponseTextException $e) {
                // NOOP
            }
            return false;
        });
    }
    
    
    /**
     * @When I wait for :text to disappear
     * @Then I should see :text disappear
     * @param $text
     * @throws \Exception
     */
    public function iWaitForTextToDisappear($text)
    {
        $this->spin(function(FeatureContext $context) use ($text) {
            try {
                $context->assertPageContainsText($text);
            }
            catch(ResponseTextException $e) {
                return true;
            }
            return false;
        });
    }
    
    /**
     * Based on Behat's own example
     * @see http://docs.behat.org/en/v2.5/cookbook/using_spin_functions.html#adding-a-timeout
     * @param $lambda
     * @param int $wait
     * @throws \Exception
     */
    public function spin($lambda, $wait = 60)
    {
        $time = time();
        $stopTime = $time + $wait;
        while (time() < $stopTime)
        {
            try {
                if ($lambda($this)) {
                    return;
                }
            } catch (\Exception $e) {
                // do nothing
            }
    
            usleep(250000);
        }
    
        throw new \Exception("Spin function timed out after {$wait} seconds");
    }
    

    【讨论】:

    • 注意:人们,你需要扩展MinkContext,因为它有assertPageContainsText
    【解决方案2】:

    Selenium2 现在具有wait($timeout, $condition) 函数。

    你可以像这样使用它:

    /**
     * @Then /^I wait for the ajax response$/
     */
    public function iWaitForTheAjaxResponse()
    {
        $this->getSession()->wait(5000, '(0 === jQuery.active)');
    }
    

    您可以测试的其他条件是:

    • 页面上某个元素的外观
    • 要完成加载的 DOM

    selenium 网站documentation 上概述了更改的原因

    【讨论】:

    • 这是我以前使用的方法,简单有效。然而,在我看来,这个测试包括对应用程序 如何 工作的限制,而您应该关心的是 if 该应用程序有效。如果您在应用程序的任何地方都使用 jQuery,这将不起作用,并且您不能在不使用 jQuery 的项目中重用它。当您的测试应该尝试独立于驱动程序时,它还取决于您运行 Selenium。不过,正如我所说,它很有效,而且很简单。
    • 我想如果 jQuery 不存在,你可以动态注入和包含它以使其正常工作......
    • 如果您有错误告诉您 jQuery 未知,请将条件更改为:(typeof jQuery != 'undefined' &amp;&amp; 0 === jQuery.active)
    【解决方案3】:

    为了帮助别人,我在 FeatureContext.php 中添加了这个方法:

     /**
     * @Then I wait :sec
     */
    public function wait($sec)
    {
        sleep($sec);
    }
    

    而且它正在工作 会

    【讨论】:

    • 这不应该再使用了,因为还有其他更合适的功能来等待内容出现在页面上。目前最好的做法是调用 wait(),如下所述的@brian_d。
    【解决方案4】:
    /**
    * @Then /^I wait for the ajax response$/
    */
    public function iWaitForTheAjaxResponse()
    {
       $this->getSession()->wait(5000, '(0 === jQuery.active)');
    }
    

    它正在工作

    【讨论】:

    • 你能描述一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多