问题:
某些房间可能不可用,有些可能在随机时间不可用。 所以我做了这个循环,当我看到这个元素时,我所要做的就是停止它
mod-desired-room__map-overlay hidden
或单击房间时出现的其他任何东西。
这是循环:
public function pickOneRoom(\AcceptanceTester $I)
{
$I->wantTo('Pick a Room ');
$roomCounter = 401;
$loop = true;
do{
$room = '//*[@id="_'.$roomCounter.'"]';
$I->click($room);
$roomCounter++;
}while($loop);
}
当给定元素出现时,我需要以某种方式停止$loop
。
我搜索了很多东西,却没有发现任何类似的东西。
答案 0 :(得分:1)
您可以捕获元素不存在时引发的异常。这样的事情可能适用于您的情况:
$elementClicked = false;
do {
try {
$I->click("#my-element");
$elementClicked = true;
} catch (\Codeception\Exception\ElementNotFound $e) {
// it's ok, #my-element is not available yet
}
} while ($elementClicked === false);
基本上,只要引发$elementClicked
异常,true
就不会ElementNotFound
,因此do/while
循环会不断迭代,直到click()
通过为止
我还要添加一个超时,这样,如果它不能在不合理的长时间内单击该元素,就不会太长时间卡住:
$elementClicked = false;
$timeout = 30;
$timeStart = time();
do {
if ((time() - $timeStart) > $timeout) {
throw new \Exception("#my-element did not appear after {$timeout} seconds");
}
try {
$I->click("#my-element");
$elementClicked = true;
} catch (\Codeception\Exception\ElementNotFound $e) {
// it's ok, #my-element is not available yet, wait 1s
sleep(1);
}
} while ($elementClicked === false);