«TransitionRejection» пытается загрузить файл с новым элементом из JS с помощью селена - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу автоматизировать загрузку с большого количества файлов сайта.Для этого я перебираю множество страниц, получая идентификатор из файлов.Я делаю это, используя selenium и Perl-скрипт.

Поскольку нет возможности напрямую загружать файл в selenium, и я не могу использовать какой-то вид curl, потому что мне нужен сеанс из selenium, который я пытаюсьиспользуйте следующий обходной путь, который я уже использовал в других проектах.

Я создаю элемент JS и выполняю скрипт с URL для каждого файла, например:

var a = document.createElement("a");
a.setAttribute("href", "https://myurl.com/id1/export?format=TCX");
a.setAttribute("download", "https://myurl.com/id1/export?format=TCX");
document.body.appendChild(a);
a.click();
document.body.removeChild(a);

Но когда япопытаться сделать это, я становлюсь следующей ошибкой в ​​скрипте:

Ошибка при выполнении команды: ссылка на устаревший элемент: ссылка на элемент является устаревшей;либо элемент больше не присоединен к DOM, он не находится в текущем контексте фрейма, либо документ был обновлен в строке /1.Library/Perl/5.18/Selenium/Remote/Driver.pm 391. в / Library / Perl /5.18 / Selenium / Remote / Driver.pm строка 348.

Если я воспроизвожу это непосредственно в консоли Firefox, я получу это:

TransitionRejection (тип: 2, сообщение: Переход был заменен другим переходом, подробно: Переход № 2 ('top.ids.info.byId' {"myId1": "XXXXX", "myId2": "YYYYYY"} -> 'home' {"feedId ": null," tag ": null}))

Если я просто получаю доступ к URL с помощью обычного GET из браузера, я получаю приглашение на загрузку без проблем.(Пока я вошел в систему)

Если я получаю URL с селеном, он работает для первого URL, но затем остается там и не загружает второй файл.

  $driver->get($download_url1); # This one is downloaded
  $driver->get($download_url2); # This line is not executed

1 Ответ

0 голосов
/ 29 декабря 2018

Мне удалось решить проблему с javascript, вместо генерации элемента, как я это сделал, я добавил некоторые атрибуты для репликации нормальной функции веб-сайта и изменил URL-адрес с:

https://myurl.com/id1/export?format=TCX

to

/id1/export?format=TCX

, поэтому код выглядит так:

my $script = 'var a = document.createElement("a");' .
    'a.setAttribute("ng-href", "' . $url_to_download .'");' .
    'a.setAttribute("target", "_self");' .
    'a.setAttribute("class", "button button-default button-block");' .
    'a.setAttribute("ng-click", "dismiss()");' .
    'a.setAttribute("href", "' . $url_to_download .'");' .
    'document.body.appendChild(a);' .
    'a.click();' .
    'document.body.removeChild(a);';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...