Невозможно привести объект типа «OpenQA.Selenium.Remote.RemoteWebElement» к типу «System.Collections.Generic.Dictionary`2[System.String,System.Object]».

Я пытаюсь зафиксировать время, необходимое для различных событий загрузки моей веб-страницы (для измерения производительности), используя API Web Timing и веб-драйверы Selenium 2 и С#.

По сути, идея (первоначально от разработчика из команды Mozilla) взята из сообщения в блоге Дина Хьюма... http://deanhume.com/Home/BlogPost/measuring-web-page-performance-with-selenium-2-и-веб-таймингс-api/56

Я беззастенчиво скопировал класс extensions и написал пару методов для получения чисел в нужном мне формате.

public static class Extensions
{
    public static Dictionary<string, object> WebTimings(this IWebDriver driver)
    {
        const string scriptToExecute =
            "var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var timings = performance.timing || {}; return timings;";

        var webTiming = (Dictionary<string, object>)((IJavaScriptExecutor)driver)
            .ExecuteScript(scriptToExecute);

        return webTiming;
    }
}

Мой метод, который даст мне разницу во времени ...

        //InternetExplorerOptions options = new InternetExplorerOptions();
        //options.IntroduceInstabilityByIgnoringProtectedModeSettings = true;
        //options.UseInternalServer = true;
        //IWebDriver _driver = new InternetExplorerDriver(options);

        IWebDriver _driver = new FirefoxDriver();

        //IWebDriver _driver = new ChromeDriver();

        Program p = new Program();

        _driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 30));
        _driver.Navigate().GoToUrl("http://www.google.com");

        Dictionary<string, object> webTimings = _driver.WebTimings();
        Dictionary<string, Int64> timeinSec = new Dictionary<string, Int64>();

        timeinSec.Add("ConnectTime", p.GetTimeDiff(webTimings["connectEnd"], webTimings["connectStart"]));

Я сталкиваюсь с этим исключением, когда использую InternetExplorerDriver (параметры). Но тот же код работает для драйверов Firefox и Chrome.

IE всегда был занозой в заднице, и он продолжает оставаться таковым ** Я не понимаю, как еще я могу использовать то, что возвращает .ExecuteScript(scriptToExecute);...?

Оцените любые входные данные здесь ..

Unhandled Exception: System.InvalidCastException: Unable to cast object of type
'OpenQA.Selenium.Remote.RemoteWebElement' to type 'System.Collections.Generic.Di
ctionary`2[System.String,System.Object]'.
   at Selenium.Examples.Performance.Extensions.WebTimings(IWebDriver driver) in
C:\Users\......\Extensions.cs:line 13
   at PerfCaptureSample.Program.Main(String[] args) in C:\.........\Program.cs:line 52

person Kir    schedule 13.06.2012    source источник
comment
Не переводите объект в словарь. назначьте его переменной, а затем проверьте, каково значение этой переменной   -  person Sandeep Singh Rawat    schedule 14.06.2012
comment
Прошу прощения, я не провел достаточного расследования, и мой ответ был чушью, поэтому я удалил его. Я попытался выполнить тот же скрипт на Java и столкнулся с той же проблемой: IE не возвращает то, что должен.   -  person JacekM    schedule 14.06.2012


Ответы (1)


Будучи невероятно старым, я столкнулся с этой же проблемой. Я понял, что вы можете преобразовать объект, используя toJSON, и он вернется правильно. Рабочий код следующий:

return timings.toJSON();

Окончательный код:

public static class Extensions
{
    public static Dictionary<string, object> WebTimings(this IWebDriver driver)
    {
        const string scriptToExecute =
            "var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var timings = performance.timing || {}; return timings.toJSON();";

        var webTiming = (Dictionary<string, object>)((IJavaScriptExecutor)driver)
        .ExecuteScript(scriptToExecute);

        return webTiming;
    }
}
person tlbignerd    schedule 16.02.2016