Я только что обновил свой браузер Chrome (версия 50.0.2661.75) и обнаружил, что страница chrome: // downloads изменилась так, что мои автоматические тесты больше не могут взаимодействовать с ней. Раньше я использовал Watir-Webdriver для очистки страницы загрузок, удаления файлов с моей машины и т. Д. Без особых трудностей.

Похоже, Google использует Polymer на этой странице, и

  • есть новые (для меня) элементы, такие как paper-button, которые Watir-Webdriver не распознает

  • даже browser.img(:id, 'file-icon').present? возвращает false, когда я четко видно, что изображение находится на странице.

Является ли автоматизация страницы, созданной с помощью Polymer (в частности, страницы chrome: // downloads), безнадежным делом до тех пор, пока не будут внесены изменения в Watir-Webdriver, или есть решение этой проблемы?

2
pjd 14 Апр 2016 в 21:12

3 ответа

Лучший ответ

Учитывая, что элементы загрузки доступны в Javascript и что Watir разрешает выполнение Javascript (как указал @titusfortner), можно автоматизировать новую страницу загрузок с помощью Watir.

Обратите внимание на теневые корневые элементы (также известные как «локальный DOM» в Polymer) можно запросить с помощью $$.

Вот пример Javascript, который регистрирует наличие значка и имя файла для каждого загружаемого элемента и удаляет элементы из списка. Скопируйте и вставьте фрагмент в консоль Chrome для тестирования (проверено в Chrome 49.0.2623.112 в OS X El Capitan).

(function() {
  var items = document
                .querySelector('downloads-manager')
                .$$('iron-list')
                .querySelectorAll('downloads-item');

  Array.from(items).forEach(item => {
    let hasIcon = typeof item.$$('#file-icon') !== 'undefined';
    console.log('hasIcon', hasIcon);

    let filename = item.$$('#file-link').textContent;
    console.log('filename', filename);

    item.$.remove.click();
  });
})();

ОБНОВЛЕНИЕ. Я проверил Javascript с помощью Watir-Webdriver в OS X (с ChromeDriver 2.21). Для меня он работает так же, как и в консоли (т.е. я вижу журналы консоли, а элементы загрузки удаляются). Вот шаги для воспроизведения:

  1. Выполните следующие команды в новой оболочке irb (копировать + вставить):
require 'watir-webdriver'
b = Watir::Browser.new :chrome
  1. Во вновь открывшемся окне Chrome загрузите несколько файлов, чтобы создать несколько загружаемых элементов, а затем откройте вкладку Загрузки .

  2. Выполните следующие команды в оболочке irb (копировать + вставить):

script = "(function() {
  var items = document
                .querySelector('downloads-manager')
                .$$('iron-list')
                .querySelectorAll('downloads-item');

  Array.from(items).forEach(item => {
    let hasIcon = typeof item.$$('#file-icon') !== 'undefined';
    console.log('hasIcon', hasIcon);

    let filename = item.$$('#file-link').textContent;
    console.log('filename', filename);

    item.$.remove.click();
  });
})();"

b.execute_script(script)
  1. Обратите внимание, что вкладка Загрузки больше не содержит элементов для загрузки.

  2. Откройте консоль Chrome на вкладке Загрузки .

  3. Обратите внимание на то, что консоль показывает несколько строк hasIcon true и имен файлов загруженных элементов.

2
15 Апр 2016 в 21:58

Похоже, Google поместил элементы в Shadow-Dom, который не поддерживается спецификацией Selenium / Watir / WebDriver (пока). Есть способ получить элемент с помощью javascript (browser.execute_script(<...>)), но в лучшем случае это экспериментальный вариант.

2
titusfortner 14 Апр 2016 в 20:03

Пытаясь автоматизировать страницу Polymer, я обнаружил, что могу получить доступ к веб-элементам, попросив Polymer использовать теневой дом, добавив в URL-адрес? Dom = shady. Как в примере на этой странице https://www.polymer-project.org /1.0/docs/devguide/settings:

http://example.com/test-app/index.html?dom=shady

Возможно, стоит попробовать добавить параметр dom, чтобы запросить Polymer использовать теневой дом.

0
sean_robbins 21 Ноя 2016 в 11:09