Привет, я новичок в Facebook. Мне нужна помощь в получении HTML-кода страницы AJAX.
Вот мои ожидаемые результаты:
$first == HTML source of the 1st page.
$second == HTML source of the 2nd page.
$third == HTML source of the 3rd page.
Но мой Выход:
$first == HTML source of the 1st page.
$second == $first
$third == HTML source of the 2nd page.
Тем не менее, я мог получить исходный код HTML 2-й страницы, когда попал на 3-ю страницу.
Я не знаю, почему я не могу получить текущий HTML-код на текущей странице.
Пожалуйста помоги!
Вот мой код:
<?php
$host = 'http://localhost:4444/wd/hub';
$capabilities = DesiredCapabilities::firefox();
$driver = RemoteWebDriver::create($host, $capabilities, 5000);
// Openning page
$driver->get('https://careers.yahoo.com/?global=1');
// Click 'Search'
$driver->findElement(WebDriverBy::className('yellow-submit'))->click();
// Wait until Ajax part loaded
$driver->wait(40)->until(
WebDriverExpectedCondition::presenceOfAllElementsLocatedBy(
WebDriverBy::className('actions-container')
));
// Print HTML of the 1st page
$first = $driver->getPageSource();
print_r($first);
// go to 2nd page
$driver->findElement(WebDriverBy::id('next'))->click();
// Wait until the 2nd page is loaded
$driver->wait(40)->until(
WebDriverExpectedCondition::presenceOfAllElementsLocatedBy(
WebDriverBy::className('actions-container')
));
// Print HTML of the 2nd page
$second = $driver->getPageSource();
print_r($second);
// go to 3rd page
$driver->findElement(WebDriverBy::id('next'))->click();
// Wait until the 3rd page is loaded
$driver->wait(40)->until(
WebDriverExpectedCondition::presenceOfAllElementsLocatedBy(
WebDriverBy::className('actions-container')
));
// Print HTML of the 3rd page
$second = $driver->getPageSource();
print_r($third);
$driver->quit();
«… Если страница была изменена после загрузки (например, с помощью Javascript), нет никакой гарантии, что возвращаемый текст соответствует тексту измененной страницы …» (часть getPageSource)
В конце концов, это означает, что селен не обязательно является последним источником! в данный момент.
Для вашего результата: зацикливание — это хорошо, попробуйте немного поспать между поисками элемента. это сэкономит тестам ненужное время сна, но все равно не сломается,
в JQuery существует такой флаг, что JQuery.active = 0 после завершения всего Ajax. Верно ли это в AJAX без JQuery, я не знаю.
Следующий код, который я украл у кого-то здесь, и я не могу на всю жизнь вспомнить, где, но это удобно (в контексте JQuery + Selenium2 + PHPUnit)
public function waitForAjax()
{
while(true)
{
$ajaxIsComplete = array(
'script' => 'return jQuery.active == 0',
'args' => array()
);
$ajaxIsComplete = $this->execute($ajaxIsComplete);
if ($ajaxIsComplete) {
break;
}
sleep(1);
}
}
а не просто торчащий «сон» (N) «на все, где N это произвольное число, в конце концов, приятно не ДОЛЖНО ждать так долго каждый раз …