如何使用Selenium和(PHP)Facebook WebDriver从javascript渲染页面获取渲染HTML?

时间:2019-01-07 16:37:39

标签: javascript php selenium webdriver selenium-chromedriver

在使用Selenium和Chromedriver在Facebook WebDriver API中用Javascript(react.js)渲染网站后,我试图获取网站的完整HTML,而我没有使用

$driver->executeScript("return document.getElementsByTagName('html')[0].innerHTML");

我想获取HTML以便从网站上抓取一些信息。我尝试了sleep(10),然后保存了一个屏幕截图,使用getPageSource获取页面源,并执行了一个脚本,该脚本应返回标记内的所有内容。该图像清楚地表明页面已渲染了javascript(就像我手动导航到url并研究html一样,当javascripts渲染了页面时,我看到了div等),但是脚本和源代码都显示了这些div。

我一直试图等待以下功能:

$driver->wait(10)->until(
    WebDriverExpectedCondition::presenceOfAllElementsLocatedBy(
        WebDriverBy::className('apartment-wrapper')
    )
);

但是当我测试时,它只等待不到1秒。

我使用以下命令在SSH中启动Selenium:

xvfb-run java -Dwebdriver.chrome.driver=/path/to/chromedriver -jar /usr/local/bin/selenium-server-standalone.jar -debug true

我的php代码:

namespace Facebook\WebDriver;
require __DIR__ . '/vendor/autoload.php';
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Chrome\ChromeDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
$host = 'http://localhost:4444/wd/hub';
$capabilities = DesiredCapabilities::htmlUnitWithJS(); {
    // For Chrome
    $options = new ChromeOptions();
    $options->addArguments(array(
        '--disable-extensions',
        '--disable-gpu',
        '--disable-dev-shm-usage',
        '--no-sandbox',
        '--window-size=1920,1080',
        '--headless'
    ));
    $capabilities = DesiredCapabilities::chrome();
    $capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
}
$driver = RemoteWebDriver::create($host, $capabilities, 5000);
$driver->get('https://hdejendomme.dk/bolig?query=');
sleep(20);
$driver->takeScreenshot('test.jpg');
$myfile = fopen("script.txt", "wb");
fwrite($myfile, $driver->executeScript("return 
document.getElementsByTagName('html')[0].innerHTML"));
fclose($myfile);
$myfile = fopen("source.txt", "wb");
fwrite($myfile, $driver->getPageSource());
fclose($myfile);

我希望将屏幕截图中确认的最终在浏览器中呈现的所有html保存到.txt文件中,但这不是我想要的。我只是在body标签之间获取脚本代码,而不是呈现的html

如何获取渲染的html?

0 个答案:

没有答案