Я пишу программу для очистки данных с веб-сайта.
Набор инструментов:
MS Visual Studio 2019 C#
Selenium.WebDriver v3.141.0
Selenium.Support v3.141.0
Selenium. Firefox .WebDriver v0.26.0
Я использую Selenium с FireFox, потому что это прямой доступ к веб-пакету страницы, использующие WebClient, не будут работать, так как сайт возвращает содержимое только в браузеры с поддержкой JavaScript.
string siteUrl = "http://the_site/the_pages.html";
IWebDriver iwd = new FirefoxDriver();
Я пробовал все следующее, но не все работало, что означает, что PageSource неполон:
iwd.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(60);
iwd.Navigate().GoToUrl(siteUrl);
string p = iwd.PageSource;
Затем:
iwd.Navigate().GoToUrl(siteUrl);
iwd.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(60);
string p = iwd.PageSource;
Затем:
iwd.Navigate().GoToUrl(siteUrl);
WebDriverWait waitForElement = new WebDriverWait(iwd, TimeSpan.FromSeconds(60));
waitForElement.Until(driver => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
string p = iwd.PageSource;
Затем:
iwd.Navigate().GoToUrl(siteUrl);
WebDriverWait waitForElement = new WebDriverWait(iwd, TimeSpan.FromSeconds(60));
waitForElement.Until(ExpectedConditions.ElementIsVisible(By.Id("footer"))); // There is <div class='footer'> at the end.
string p = iwd.PageSource;
XPath объекта (кнопка страницы «Далее» / href):
/html/body/div[1]/div[2]/div[11]/ul/a
HTML:
<a class='next' onClick='javascript.......' href='javascript.void(0)'>
<span>Next</span>
</a>
Итак, я попробовал:
iwd.Navigate().GoToUrl(siteUrl);
WebDriverWait waitForElement = new WebDriverWait(iwd, TimeSpan.FromSeconds(60));
waitForElement.Until(drv => drv.FindElement(By.ClassName("next")));
string p = iwd.PageSource;
Со всем вышеперечисленным я получаю веб-страницу / firefox работает в течение нескольких секунд, а затем возвращается к строке iwd.PageSource.
Единственное, что работает, заключается в следующем:
iwd.Navigate().GoToUrl(siteUrl);
System.Threading.Thread.Sleep(60000);
string p = iwd.PageSource;
Возможно, проблема в том, что страницы initia lly быстро загружает шаблон, а затем iframe с помощью команды javascript / ajax.
Я могу жить со взломом спящего потока, но это сэкономит много времени, если ожидания Selenium могут работать как предназначенный.