首页 > 解决方案 > 硒滚动等待

问题描述

我不明白为什么只有部分链接没有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

标签: phpseleniumgoogle-chromewebdriver

解决方案


页面很可能已经实现了延迟加载——任何额外的信息——新元素,只有在用户滚动到页面末尾时才通过 ajax 请求。

这就是你的脚本中发生的事情 - 你已经执行了 js 以滚动到最后。如果您此时在findElements没有睡眠的情况下执行,则页面将没有时间发送 ajax 请求、等待解析响应并更新 DOM。因此,您将仅获得当前存在的元素。

有了sleep你给它那种可能性。

请记住,硬编码值 1s 有时可能有效,有时 - 无效;如果后端需要更多时间来生成响应,或者网络速度很慢 - 可能无法及时接收到新数据。

另一种解决方案是每 X 毫秒轮询 DOM 以获取目标元素的数量,并在该数量增加后继续。但是,这必须适应没有更多结果的情况(不再有 артикулы 俄语?артикули 保加利亚语?:),并打破轮询循环(如果页面上有总结果计数器或类似情况,可以这样做) .


推荐阅读