用于查看OrWaitForElement的Codeception函数

时间:2014-07-24 08:28:56

标签: selenium codeception

我有一个应用程序,我想用selenium / codeception进行测试。它有很多ajax函数可以更改页面(显示/隐藏页面的部分),这些代码当前处理得不好。

我遇到的问题是我想点击按钮/元素

  • 已经在页面上(ajax调用提前完成)
  • 尚未出现在页面上(等待ajax响应)

如果我使用waitForElement()它似乎只在第二种情况下工作(它等待元素出现并继续)但如果元素已经存在,则waitForElement将超时并触发失败。

我正在寻找的是一个seeOrWaitForElement()函数,但我无法弄清楚如何在代码中插入逻辑。

这个功能在某个地方可用吗?或者我怎样才能以另一种方式解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以使用

waitForJs("return document.querySelector('".$element."') != null", $seconds);

将等待元素存在(如果元素已存在则立即返回)。

答案 1 :(得分:1)

Codeception在2.3.4版中引入了一项称为SmartWait的功能,这似乎是解决您的问题的绝妙解决方案。请注意,它不适用于所有类型的定位器。

来自Codeception documentation

SmartWait

自2.3.4版本起

可以务实地等待元素。如果测试使用的页面上尚未存在的元素,则Codeception将等待几秒钟再失败。此功能基于硒的隐式等待。 Codeception仅在搜索特定元素时才启用隐式等待,而在所有其他情况下都禁用。因此,测试的性能不会受到影响。

可以通过在WebDriver配置中设置等待选项来启用SmartWait。它期望等待的秒数。示例:

wait: 5

使用此配置,我们进行了以下测试:

<?php
// we use wait: 5 instead of
// $I->waitForElement(['css' => '#click-me'], 5);
// to wait for element on page
$I->click(['css' => '#click-me']);

重要的是要了解SmartWait仅适用于特定的定位器:

  • #locator-CSS ID定位器,有效
  • //locator-通用的XPath定位器,有效
  • ['css' => 'button'']-严格的定位器,有效

但是不会对所有其他定位器类型执行。参见示例:

<?php
$I->click('Login'); // DISABLED, not a specific locator
$I->fillField('user', 'davert'); // DISABLED, not a specific locator
$I->fillField(['name' => 'password'], '123456'); // ENABLED, strict locator
$I->click('#login'); // ENABLED, locator is CSS ID
$I->see('Hello, Davert'); // DISABLED, Not a locator
$I->seeElement('#userbar'); // ENABLED
$I->dontSeeElement('#login'); // DISABLED, can't wait for element to hide
$I->seeNumberOfElements(['css' => 'button.link'], 5); // DISABLED, can wait only for one element

答案 2 :(得分:0)

我使用docs中的waitForJS并且它有效。例如:

$I->see('Jane Doe', '#table tbody tr');
$I->click(['css' => '#reload-ajax']);    // Ajax trigger here
$I->waitForJS("return $.active == 0;", 60);
$I->see('John Doe', '#table tbody tr');