#internet-explorer #selenium #selenium-webdriver #webdriver
#internet-explorer #Селен #Selenium-webdriver #webdriver
Вопрос:
Я столкнулся с проблемой с InternetExplorer WebDriver, которая сводит меня с ума.
IE по какой-то причине не ждет загрузки страницы и продолжает выполнять код.
Следующий код открывает страницу Google и не открывает страницу Википедии сразу после:
var driver = new InternetExplorerDriver();
driver.Navigate().GoToUrl("http://google.com");
driver.Navigate().GoToUrl("http://wikipedia.org");
В FireFox совершенно другое поведение. Этот код открывает страницу Google, а затем открывает страницу Википедии:
var driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://google.com");
driver.Navigate().GoToUrl("http://wikipedia.org");
Как я могу заставить IE вести себя так же, как FireFox?
Версия IE — 11.0.9600.17107; Selenium.Версия WebDriver — 2.42 (установка NuGet); Selenium.WebDriver.Версия IEDriver — 2.24 (установка NuGet)
Вот код, который я использовал для тестирования с явным ожиданием. В результате этого теста я получаю «openQA.Selenium.Исключение WebDriverTimeoutException: время ожидания истекло через 30 секунд —> openQA.Selenium.Исключение NoSuchWindowException: не удается найти элемент в закрытом окне»:
[TestMethod]
public void Open()
{
var driver = new InternetExplorerDriver();
driver.Navigate().GoToUrl("http://google.com");
driver.Navigate().GoToUrl("http://wikipedia.org");
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
var myElement = wait.Until(d => d.FindElement(By.CssSelector("input#www-wikipedia-org")));
Assert.IsNotNull(myElement);
}
Только что проверил предложение с указанием времени ожидания загрузки страницы. Не помогло. Поведение такое же.
С наилучшими пожеланиями,
Дмитрий
Комментарии:
1. Я работаю с selenium и Java. Попробуйте поместить Thread.sleep() после первого goToUrl()
2. Стоит отметить, что используемый вами IEDriverServer очень старый, если он 2.24. Не существует официального пакета NuGet, поддерживаемого Selenium peoject для исполняемого файла драйвера IE; пакеты, содержащие скомпилированные двоичные файлы, не одобряются в экосистеме NuGet.
Ответ №1:
Я использую Windows 7 / IE 11, и тестовая последовательность, перенесенная из Windows 7 / IE 10, внезапно запустилась, чтобы не ждать загрузки страницы; через 10 мс он перешел на следующую страницу и так далее.
Я «исправил» проблему, установив защищенный режим на выключенный во всех четырех областях (Интернет, локальный Интернет, надежные сайты и сайты с ограниченным доступом) в диалоговом окне свойств обозревателя; обязательно отключать флаг везде, потому что в противном случае IEWebDriver жалуется на это и вообще не запускает IE. Также исправлена проблема, из-за которой иногда окно IE оставалось открытым в конце теста, несмотря на явную команду закрыть его.
Это оставляет место открытым для вредоносных атак, поэтому это не для всех случаев, но работает.
Комментарии:
1. Я просто хотел бы отметить, что не обязательно отключать защищенный режим во всех зонах. Вполне допустимо включить его и для всех зон, что сохраняет безопасность, для которой был разработан защищенный режим. В этом сообщении в блоге описываются технические причины, по которым настройки защищенного режима должны быть установлены в первую очередь.
Ответ №2:
Просто добавьте промежуточный оператор печати! Я не знаю, почему это работает (и почему не без), но это работает на моем компьютере. С Java и TestNG код будет выглядеть следующим образом:
@BeforeTest
public void setup() {
System.setProperty("webdriver.ie.driver", "C:/Dependancies/IEDriverServer.exe");
driver = new InternetExplorerDriver();
}
@Test
public void test() {
driver.get("http://www.gamedev.net/page/index.html");
//System.out.println(driver.getTitle());
System.out.println("Hello");
driver.get("http://www.gamasutra.com/");
}
Обратите внимание, что:
- Я объявил переменную драйвера типа WebDriver на уровне класса (переменная экземпляра).
- Я убедился, что использую 64-разрядную версию драйвера Internet Explorer, поскольку я использую 64-разрядную версию браузера Internet Explorer. Если вы используете 32-разрядную версию браузера Internet Explorer, вам потребуется использовать 32-разрядную версию драйвера Internet Explorer. Как определить, какую версию браузера Internet Explorer мы используем: путем проверки пути к исполняемому файлу, находится ли он в «Program Files» или в «Program Files (x86)».
- Если вы используете C #, вы можете установить консоль.Оператор WriteLine() вместо оператора System.out.println().
Ответ №3:
Добавьте неявное ожидание в свой код после первоначальной инициализации веб-драйвера. Это позволит полностью загрузить начальную страницу перед выполнением следующего шага.
Комментарии:
1. Неявное ожидание не помогает. IE вообще не ожидает загрузки страницы. Я попробовал этот код, и Википедия не загружается: var driver = new InternetExplorerDriver(); драйвер. Управление ().Тайм-ауты().implicitlyWait(TimeSpan.FromSeconds(20)); driver.Navigate().GoToUrl(» google.com » ); driver.Navigate().GoToUrl(» wikipedia.org » );
2. Вместо этого используйте явное ожидание, выберите элемент на странице Википедии и явно дождитесь этого элемента, прежде чем продолжить.
3. Просто попробовал с явным ожиданием. Получено это исключение: openQA.selenium. Исключение WebDriverTimeoutException: время ожидания истекло через 30 секунд —> openQA.Selenium. Исключение NoSuchWindowException: не удается найти элемент в закрытом окне.
Ответ №4:
Попробуйте этот код (C #):
Driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(2));
Приведенный выше код будет ждать загрузки страницы до 10 секунд. Если загрузка страницы превысит время, это вызовет исключение TimeoutException. Это неявное ожидание. Если вы установите это значение один раз, оно будет иметь область действия до уничтожения экземпляра веб-драйвера.
Комментарии:
1. Только что проверил это. Не помогло. Поведение такое же. Код: var driver = новый InternetExplorerDriver(); драйвер. Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(2));driver.Navigate().GoToUrl(» google.com»);driver.Navigate().GoToUrl(«http://… ;
Ответ №5:
Почему бы вам просто не объявить:
driver.findElement(By.by("element_to_wait_for"));
Он будет искать элемент, который, как вы знаете, завершается на странице, пока не истечет время.
Вероятно, вам также придется изменить время ожидания, чтобы он не сработал сразу.