我有一个应用程序,我想用selenium / codeception进行测试。它有很多ajax函数可以更改页面(显示/隐藏页面的部分),这些代码当前处理得不好。
我遇到的问题是我想点击按钮/元素
如果我使用waitForElement()它似乎只在第二种情况下工作(它等待元素出现并继续)但如果元素已经存在,则waitForElement将超时并触发失败。
我正在寻找的是一个seeOrWaitForElement()函数,但我无法弄清楚如何在代码中插入逻辑。
这个功能在某个地方可用吗?或者我怎样才能以另一种方式解决这个问题?
答案 0 :(得分:2)
您可以使用
waitForJs("return document.querySelector('".$element."') != null", $seconds);
将等待元素存在(如果元素已存在则立即返回)。
答案 1 :(得分:1)
Codeception在2.3.4版中引入了一项称为SmartWait的功能,这似乎是解决您的问题的绝妙解决方案。请注意,它不适用于所有类型的定位器。
可以务实地等待元素。如果测试使用的页面上尚未存在的元素,则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');