我不能理解为什么只返回了部分链接而没有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
发布于 2018-09-15 11:47:12
页面很可能已经实现了延迟加载--任何额外的信息--只有当用户滚动到页面末尾时,才会通过ajax请求新元素。
这就是在你的脚本中发生的事情--你已经执行了js来滚动到最后。如果在没有休眠情况下执行findElements,页面将没有时间发送ajax请求、等待解析响应和更新DOM。因此,您将只获得当前存在的元素。
有了sleep,你就可以让它实现这种可能性。
记住硬编码值1有时可以工作,有时不能;如果后端需要更多时间来生成响应,或者网络速度很慢-新数据可能无法及时接收。
另一种解决方案是每隔X毫秒轮询DOM以获取目标元素的数量,并在该数量增加后继续轮询。但是,这必须适应没有更多结果的情况(不再有артикулы俄语?артикули保加利亚语?:),并打破轮询循环(可以在页面上有总结果计数器或类似的情况下完成)。
https://stackoverflow.com/questions/52334213
复制相似问题