Selenium Scroll Wait - PullRequest
       2

Selenium Scroll Wait

0 голосов
/ 14 сентября 2018

Не могу понять, почему возвращается только часть ссылок без функции sleep(1);. Хотя скрипт работает синхронно и после $web_driver->executeScript объект уже загружен, все ссылки уже загружены.

 <?php

  require_once('vendor/autoload.php');
  use Facebook\WebDriver\Remote\RemoteWebDriver;
  use Facebook\WebDriver\WebDriverBy;

  $caps = array("platform"=>"SIERRA", "browserName" => "chrome", "version" => "69");
  $web_driver = RemoteWebDriver::create(
    "http://localhost:4444/wd/hub",
    $caps
  );
  $web_driver->get("https://winestyle.ru/wine/gerard-bertrand/");

  $web_driver->executeScript('window.scrollTo(0,document.body.scrollHeight);');
  sleep(1);

  $element = $web_driver->findElements(WebDriverBy::cssSelector(".bg-text[title='Артикул']"));
  foreach ($element as $e){
    echo $e->getText().'<br>';
  }

  $web_driver->quit();
?>

возврат без сна:

Артикул: в101222 Артикул: в99863 Артикул: в99981 Артикул: в101225 Артикул: в101212 Артикул: в101224 Артикул: в101211 Артикул: в92722 Артикул: в92723 Артикул: в101208 Артикул: в101210 Артикул: в99979 Артикул: в101223 Артикул: в101220 Артикул: в101213 Артикул: в101221 Артикул: в101227 Артикул: в101218 Артикул: в101217 Артикул: в101215

возврат со сном:

Артикул: в101222 Артикул: в99863 Артикул: в99981 Артикул: в101225 Артикул: в101212 Артикул: в101224 Артикул: в101211 Артикул: в92722 Артикул: в92723 Артикул: в101208 Артикул: в101210 Артикул: в99979 Артикул: в101223 Артикул: в101220 Артикул: в101213 Артикул: в101221 Артикул: в101227 Артикул: в101218 Артикул: в101217 Артикул: в101215 Артикул: в101226 Артикул: в99980 Артикул: в85254 Артикул: в66382 Артикул: в66386 Артикул: в66387 Артикул: в85253 Артикул: в101214 Артикул: в101219

1 Ответ

0 голосов
/ 15 сентября 2018

Скорее всего, на странице реализована отложенная загрузка - любая дополнительная информация - новые элементы, запрашиваемые через ajax, только когда пользователь прокручивает до конца страницы.

И это то, что происходит в вашем скрипте - вы выполнили js для прокрутки до конца. Если вы в этот момент выполните findElements без сна, у страницы не будет времени отправить запрос ajax, дождаться разбора ответа и обновить DOM. Таким образом вы получите только имеющиеся в данный момент элементы.

С sleep вы даете ему такую ​​возможность.

Имейте в виду, что жестко закодированное значение 1 может иногда работать, а иногда - нет; если для генерации ответа бэкэнду требуется больше времени или сеть работает медленно - новые данные могут быть не получены вовремя.

Альтернативное решение - опросить DOM на количество целевых элементов каждые X миллисекунд и продолжить, как только это число увеличится. Это, однако, должно соответствовать случаю, когда больше нет результатов (больше нет артикулы Russian? Артикули Bulgarian? :) и вырваться из цикла опроса (это можно сделать, если на странице есть счетчик итоговых результатов или подобное) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...