密码:循环直到元素出现在屏幕上

时间:2018-08-09 11:15:03

标签: php automated-tests codeception

问题:

某些房间可能不可用,有些可能在随机时间不可用。 所以我做了这个循环,当我看到这个元素时,我所要做的就是停止它

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。 我搜索了很多东西,却没有发现任何类似的东西。

1 个答案:

答案 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);