Selenium RC: Как проверить, имеет ли элемент заданный атрибут?


У меня есть несколько кнопок с атрибутом onclick, а некоторые - нет. Я хочу проверить, имеет ли указанный элемент атрибут onclick. Как я могу это сделать?

getAttribute() возвращает значение атрибута, если оно у него есть. Когда этого не происходит, он создает исключение RuntimeException и останавливает тест (даже когда я заключаю его в блок try/catch).

$onclickValue = $this->getAttribute("$locator@onclick"); //works when the attribute exists
Author: Andrew, 2010-06-02

4 answers

С помощью getEval() вы можете выполнить функцию javascript hasAttribute(). Использование findElement() позволит вам работать с любым типом шаблона локатора.

$hasAttribute = $this->getEval('this.browserbot.findElement("' . $locator . '").hasAttribute("onclick")');
if ($hasAttribute === 'true') {
    //attribute exists
}

Обратите внимание, что getEval() возвращает строку, а не логическое значение.

 4
Author: Andrew, 2010-06-02 16:24:48

Вы можете сначала проверить, присутствует ли элемент, используя XPath //location/of/element[@onclick]

 2
Author: Dave Hunt, 2010-06-02 15:52:29

Пожалуйста, извините меня, если это не относится к Selenium RC. В среде IDE Selenium можно использовать

assertElementNotPresent

Команда, которая (несмотря на название) может определить, присутствует ли данный атрибут. Это единственный параметр - локатор элементов, который может иметь вид

element-id@attribute.

Конечно, это будет уместно только в том случае, если вы знаете, какие элементы должны иметь соответствующий атрибут. Если нет, то, я думаю, вам придется перебирать наборы элементов с помощью XPath выражения.

 0
Author: crantok, 2011-03-17 12:38:55

Причина, по которой возникает исключение RuntimeException, заключается в том, как работает драйвер selenium PHPUnit.

Он рассматривает определенные ситуации как ошибки, которые приводят к остановке() выполнения теста. В частности, код, который останавливает тест в этой ситуации, выглядит следующим образом:

protected function getString($command, array $arguments)
{
    try {
        $result = $this->doCommand($command, $arguments);
    }

    catch (RuntimeException $e) {
        $this->stop();

        throw $e;
    }

    return (strlen($result) > 3) ? substr($result, 3) : '';
}

Я уже открыл проблему, касающуюся этого способа обработки ошибок в драйвере, в https://github.com/sebastianbergmann/phpunit/issues/276

Кстати, удаление вызовов stop() в как doCommand(), так и getString() из /usr/share/php/PHPUnit/Extensions/SeleniumTestCase/Driver.php сделает ваш код способным улавливать исключение и обрабатывать его так, как вы предпочитаете.

 0
Author: David Santiago Turiño, 2011-07-14 14:27:48