You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

294 lines
6.9 KiB

<?php
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
use Facebook\WebDriver\Exception\NoSuchElementException;
use Facebook\WebDriver\Exception\StaleElementReferenceException;
/**
* Trait for objects implementing IWaitable interface.
*/
trait WaitableTrait {
/**
* Get object selector (if any) as text.
*
* @return string
*/
public function getSelectorAsText() {
if (isset($this->by)) {
return '"'.$this->by->getValue().'" ('.$this->by->getMechanism().')';
}
return null;
}
/**
* Wait until object is ready.
*
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilReady($timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::READY, [], $timeout);
return $this;
}
/**
* Wait until object is visible.
*
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilVisible($timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::VISIBLE, [], $timeout);
return $this;
}
/**
* Wait until object is not visible.
*
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilNotVisible($timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::NOT_VISIBLE, [], $timeout);
return $this;
}
/**
* Wait until object is present.
*
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilPresent($timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::PRESENT, [], $timeout);
return $this;
}
/**
* Wait until object is not present.
*
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilNotPresent($timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::NOT_PRESENT, [], $timeout);
return $this;
}
/**
* Wait until object text is present.
*
* @param string $text text to be present
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilTextPresent($text, $timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::TEXT_PRESENT, [$text], $timeout);
return $this;
}
/**
* Wait until object text is not present.
*
* @param string $text text not to be present
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilTextNotPresent($text, $timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::TEXT_NOT_PRESENT, [$text], $timeout);
return $this;
}
/**
* Wait until object attribute is present.
*
* @param string|array $attributes attributes to be present
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilAttributesPresent($attributes, $timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::ATTRIBUTES_PRESENT, [$attributes], $timeout);
return $this;
}
/**
* Wait until object attribute is not present.
*
* @param string|array $attributes attributes not to be present
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilAttributesNotPresent($attributes, $timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::ATTRIBUTES_NOT_PRESENT, [$attributes], $timeout);
return $this;
}
/**
* Wait until object class is present.
*
* @param string|array $classes classes to be present
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilClassesPresent($classes, $timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::CLASSES_PRESENT, [$classes], $timeout);
return $this;
}
/**
* Wait until object class is not present.
*
* @param string|array $classes classes not to be present
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilClassesNotPresent($classes, $timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::CLASSES_NOT_PRESENT, [$classes], $timeout);
return $this;
}
/**
* Wait until object is clickable.
*
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilClickable($timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::CLICKABLE, [], $timeout);
return $this;
}
/**
* Wait until object is not clickable.
*
* @param integer $timeout timeout in seconds
*
* @return $this
*/
public function waitUntilNotClickable($timeout = null) {
CElementQuery::waitUntil($this, CElementFilter::NOT_CLICKABLE, [], $timeout);
return $this;
}
/**
* Get logically reversed condition. Acts as "not" statement.
*
* @param callable $condition condition to be reversed
*
* @return callable
*/
protected function getReversedCondition($condition) {
return function () use ($condition) {
try {
return !call_user_func($condition);
}
catch (NoSuchElementException $e) {
return true;
}
catch (StaleElementReferenceException $e) {
return true;
}
};
}
/**
* @inheritdoc
*/
public function getNotClickableCondition() {
return $this->getReversedCondition($this->getClickableCondition());
}
/**
* @inheritdoc
*/
public function getNotReadyCondition() {
return $this->getReversedCondition($this->getReadyCondition());
}
/**
* @inheritdoc
*/
public function getNotPresentCondition() {
return $this->getReversedCondition($this->getPresentCondition());
}
/**
* @inheritdoc
*/
public function getNotVisibleCondition() {
return $this->getReversedCondition($this->getVisibleCondition());
}
/**
* @inheritdoc
*/
public function getTextNotPresentCondition($text) {
return $this->getReversedCondition($this->getTextPresentCondition($text));
}
/**
* @inheritdoc
*/
public function getAttributesNotPresentCondition($attributes) {
return $this->getReversedCondition($this->getAttributesPresentCondition($attributes));
}
/**
* @inheritdoc
*/
public function getClassesNotPresentCondition($classes) {
return $this->getReversedCondition($this->getClassesPresentCondition($classes));
}
/**
* @inheritdoc
*/
public function getNotSelectedCondition() {
return $this->getReversedCondition($this->getSelectedCondition());
}
}