Selenium - Как найти список ТЕКУЩИХ атрибутов элемента

Основываясь на вопросе, заданном в Selenium webdriver: как найти ВСЕ атрибуты элемента?

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

Например:

>attrs = driver.execute_script('var items = {}; for (index = 0; index <arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', vlan)
>print attrs
{ u'name': u'PixF1InterfaceVLAN', u'value': u'1',}

Однако, если я посмотрю на тот же элемент «vlan»:

>vlan.get_attribute("value")
 u'10'

Что я и вижу на экране. Мой вопрос: как я могу обновить код Javascript, чтобы он отображал правильный список атрибутов?


person user1691282    schedule 10.09.2015    source источник


Ответы (1)


Я делаю обоснованное предположение, что элемент, на который вы смотрите, является элементом input, которым каким-то образом манипулировали, чтобы изменить его значение. Проблема в том, что Selenium, пытаясь быть полезным, бесполезно запутывает проблему. Позволь мне объяснить.

Используемый вами код JavaScript действительно возвращает все значения атрибутов. Однако вот в чем дело: когда значение элемента input изменяется, его value атрибут не изменяется, но изменяется его value свойство. Это свойство, содержащее текущее значение элемента input. Вы обращаетесь к нему как к полю .value на узле DOM, который соответствует элементу. Вы можете сделать:

driver.execute_script('return arguments[0].value;', vlan)

чтобы вернуть значение этого свойства.

Но почему vlan.get_attribute("value") работает? Когда вы выполняете .get_attribute("value"), Selenium на самом деле получает значение свойства. Вы думаете, что получаете значение атрибута, но это не так. По сути, Selenium незаметно исправляет ошибочное представление, которое многие из нас изначально имеют, когда мы хотим получить текущее значение элемента input.

Таким образом, ваш код JavaScript делает именно то, что должен: он возвращает значения атрибутов, но это не то, что вам нужно, вам нужно значение свойства value.

person Louis    schedule 10.09.2015
comment
Фантастическое объяснение! Вы на месте. Может быть, вы можете помочь мне сделать еще один шаг вперед. Моя проблема заключается в том, что когда я ввожу определенное входное значение vlan, это вызывает непредвиденную ошибку. Я пытаюсь понять, почему эта ошибка возникает, не имея доступа к исходному коду javascript. Я подумал, что, возможно, добавляется дополнительный атрибут, когда он находится в «состоянии ошибки», который может дать ключ к пониманию того, почему возникает ошибка при правильном вводе. Обратите внимание, что эта ошибка возникает только тогда, когда значение изменяется с помощью селена, а не обновляется вручную. - person user1691282; 11.09.2015
comment
Ничего не приходит в голову по вашему описанию. Я бы предложил опубликовать новый вопрос, который включает соответствующий код Selenium, соответствующий HTML и JavaScript, а также подробное описание того, что вы видите. - person Louis; 11.09.2015