C# Selenium FireFox драйвер не ожидает завершения страницы - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу программу для очистки данных с веб-сайта.

Набор инструментов:

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 могут работать как предназначенный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...