.NET Core, VS2019 и Selenium: драйвер IE не работает (WebDriverException - время ожидания HTTP-запроса) - PullRequest
1 голос
/ 25 сентября 2019

ОБНОВЛЕНИЕ: Эта ошибка возникает только в Visual Studio 2019. Я в сообществе 16.3.1.Visual Studio 2017 прекрасно работает и не вызывает проблем.Так что, похоже, суть проблемы заключается в какой-то причине в Visual Studio 2019.

ПРИМЕЧАНИЕ , что независимо от того, в какой IDE я его собираю, dotnet run не будет работать так же, как VS2019.Оно работает только в том случае, если я запускаю приложение в VS2017.

I перекрестно опубликовал это в Microsoft через встроенное в Visual Studio меню «Сообщить о проблеме» для решения этой проблемы с разных точек зрения.,Я сообщу, если / когда они что-то сделают (т.е. если они идентифицируют это как проблему с Visual Studio).


Мы недавно обновили .NET Framework до .NET Core.В настоящее время приложение работает на .NET Core 2.2, но такие же проблемы возникают и на .NET Core 3.0.

Мы запускаем Selenium для тестирования пользовательского интерфейса, и по некоторым причинам тесты Internet Explorer довольно выигрышны.Драйвер успешно запускает браузер, но первый вызов Navigate() зависает на неопределенное время после того, как он успешно выполняет навигацию (никогда не выходит за пределы этой строки кода).Вот полная трассировка стека:

OpenQA.Selenium.WebDriverException HResult = 0x80131500

Message = HTTP-запрос к удаленному серверу WebDriver для URL http://localhost:52211/session/9e1e828b-5e72-46d8-8012-6b29bfc2d854/url по истечении времени ожидания после10 секунд.Source = WebDriver

StackTrace: в OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest (HttpRequestInfo requestInfo)

в команде OpenQA.Selenium.Remote *HttpCommandExteTec ()* в OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute (Command commandToExecute)

в OpenQA.Selenium.Remote.RemoteWebDriver.Execute (строковые параметры driverCommandToExecute, Dictionary`2) * 10eLeNeAl *..Remote.RemoteWebDriver.set_Url (строковое значение)

в SandboxSelenium.Program.Main (строковые [] args) в C: \ dev_sandbox \ SandboxSelenium \ SandboxSelenium \ Program.cs: строка 17

Внутреннее исключение 1: WebException: истекло время ожидания операции.

Для простоты я создал совершенно новое консольное приложение .NET Core и ничего не сделал в главном, кроме повторения вышеуказанного шага, и заново создалПроблема.

Вот весь csproj проекта консольного приложения, включая ссылки на пакеты:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
    <PackageReference Include="Selenium.WebDriver.IEDriver" Version="3.150.0" />
  </ItemGroup>
</Project>

Ивот код, который я звоню:

using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using System;
using System.IO;
using System.Reflection;

namespace SandboxSelenium
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            string binPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); // In .NET Core you have to tell Selenium where the EXE is.
            InternetExplorerOptions opts = new InternetExplorerOptions();
            using (var driver = new InternetExplorerDriver(binPath, opts, new TimeSpan(0, 0, 10)))
            {
                driver.Navigate().GoToUrl("https://example.com/"); // "Line 17" in above error. This line times out!
                IWebElement someTextbox = driver.FindElement(By.Id("SomeTextBox")); // Never gets here...
                someTextbox.SendKeys("abc123");
            }
        }
    }
}

ПРИМЕЧАНИЕ: Я только устанавливаю тайм-аут команды водителя на new TimeSpan(0, 0, 10) (10 секунд), чтобы сократить тайм-аут от значения по умолчанию 60секунд.Он истекает вне зависимости от того, насколько велик или короток тайм-аут.

Кроме того, кажется, что исполняемый файл сервера IEDriverServer.exe тоже не закрывается и остается открытым после сбоя.

Я подозреваю, , что каким-то образом Selenium теряет связь с IE или чем-то еще, поскольку он, похоже, полностью теряет сам браузер.Не уверен, хотя. Я пытался изменить PageLoadStrategy в InternetExplorerOptions для драйвера, но это не помогло.Я также пытался , используя 64-битный пакет NuGet для драйвера сервера IE, но это ничего не изменило.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 26 сентября 2019

с использованием (var driver = new InternetExplorerDriver (binPath, opts, new TimeSpan (0, 0, 10))) *

Проблема связана с настройкой InternetExplorerDriver (приведенный выше код).Пожалуйста, проверьте метод InternetExplorerDriver (String, InternetExplorerOptions, TimeSpan) , мы видим, что TimeSpan означает максимальное количество времени ожидания для каждой команды.если время ожидания истекло, это покажет эту ошибку.

Чтобы предотвратить эту ошибку, вы можете попытаться продлить время ожидания или удалить этот параметр.Код как показано ниже:

        using (var driver = new InternetExplorerDriver(binPath, opts))
        {
            driver.Navigate().GoToUrl("https://www.bing.com/"); // "Line 17" in above error. This line times out!
            IWebElement someTextbox = driver.FindElement(By.Id("sb_form_q")); // Never gets here...
            someTextbox.SendKeys("abc123"); 
        }

Редактировать :

Вы можете продлить время ожидания, например, установить его на 20 секунд.

Кроме того,Когда мы используем метод SendKeys для ввода значений в текстовое поле, он может быть очень медленным и тратить слишком много времени.В качестве обходного пути, чтобы уменьшить затраты времени, мы могли бы использовать IJavaScriptExecutor для выполнения сценария JavaScript и установить значение.

Код, как показано ниже:

        using (var driver = new InternetExplorerDriver(binPath, opts, new TimeSpan(0, 0, 20)))
        {
            driver.Navigate().GoToUrl("https://www.bing.com/"); // "Line 17" in above error. This line times out!
            //IWebElement someTextbox = driver.FindElement(By.Id("sb_form_q")); // Never gets here...
            //someTextbox.SendKeys("abc123");
            var element = driver.FindElementById("sb_form_q");

            var script = "document.getElementById('sb_form_q').value = 'webdriver';";
            IJavaScriptExecutor jse = (IJavaScriptExecutor)driver;

            jse.ExecuteScript(script, element); 
            element.SendKeys(Keys.Enter); 
        }
...