【问题标题】:JQuery Javascript function to return highchart graph data source in JSON and formatted correctly through Selenium and C#JQuery Javascript 函数以 JSON 格式返回 highchart 图形数据源,并通过 Selenium 和 C# 正确格式化
【发布时间】:2018-01-12 14:00:27
【问题描述】:

我正在尝试弄清楚如何使用 Selenium 和 C# 获取与返回给我的 highchart 图的 JSON 等价物。我已经走了很远,但我遇到了几个问题。对于具体的highchart,执行以下步骤:

问题 #1

我可以在 DEV 工具的控制台选项卡中使用以下功能来检索 JSON 格式的数据,但它没有正确组织它(它首先列出所有 EPA,然后列出所有这些 EPA 的值)JSON.stringify(angular.element($('#EPAChart')).scope().$parent.vm['epaGraphData']);

当我使用 C# 和 Selenium 将其插入 Visual Studio,然后尝试将其转换为 DataTable 时,它​​不允许我这样做,因为数据组织不正确。对于类似的问题,请参阅:Newtonsoft.Json JsonConvert To Datatable

using Newtonsoft.Json;
using OpenQA.Selenium;
string jsText = string.Format("return JSON.stringify(angular.element($('#EPAChart')).scope().$parent.vm['epaGraphData']);")
var jsResult = driver.ExecuteScript(jsText) as string;
JsonConvert.DeserializeObject<DataTable>(jsResult);

问题 #2

我有一个 Javascript/Jquery 函数,它可以正确组织生成 JSON,但我不知道如何使用 Selenium/C# 调用它。代码 driver.ExecuteScript 不喜欢这个函数,我猜是因为太复杂而且使用了变量,所以 driver.ExecuteScript (IJavaScriptExecutor->ExecuteScript) 会抛出异常。这是函数:

var epadatasource = []; for(var i=0;i<angular.element($('#EPAChart')).scope().$parent.vm['epaGraphData'].Categories.length;i++){epadatasource.push({category: angular.element($('#EPAChart')).scope().$parent.vm['epaGraphData'].Categories[i], data: angular.element($('#EPAChart')).scope().$parent.vm['epaGraphData'].Data[i]}); }; JSON.stringify(epadatasource);

对于问题 #2,我如何在 C#/Selenium 中调用上述函数,以便它不会引发异常,而是返回我的 JSON?或者对于问题 #1,是否有正确组织 JSON 的解决方法?

【问题讨论】:

  • 这是两个独立的问题。您应该在此处拆分问题 #2 并将其放入一个新问题中,以避免与答案混淆,并在有人知道一个但不知道另一个的情况下更容易回答。
  • 对于问题 #2,将整个内容放在 string 中,就像在问题 #1 代码中所做的那样,并在最后一个命令之前添加 return,例如return JSON.stringify(...) 它应该可以工作。它在控制台中工作,但在代码中,你必须返回一些东西。
  • 谢谢。我添加了答案

标签: javascript c# jquery angularjs selenium


【解决方案1】:

我找到了问题 #1 的解决方法,@jeffC 提供了问题 #2 的解决方案

问题1的解决方法是将JSON添加到C#对象中,然后将其转换为新对象,并将其反序列化为固定的JSON:

  public static string TransformJSON(string json, IWebElement chartElem)
    {
        string fixedJson = "";

        if (chartElem.GetAttribute("id") == "EPAChart")
        {
            dynamic obj = JsonConvert.DeserializeObject<EPAObservationCountOriginal>(json);
            List<EPAObservationCountFixed> fixedObject = new List<EPAObservationCountFixed>();
            for (int i = 0; i < obj.Categories.Length; i++)
            {
                fixedObject.Add(new EPAObservationCountFixed() { category = obj.Categories[i], data = obj.Data[i] });
            }

            fixedJson = JsonConvert.SerializeObject(fixedObject);
        }

        return fixedJson;
    }

    #endregion methods

    #region Class objects representing graphs

    public class EPAObservationCountFixed
    {
        public string category { get; set; }
        public string data { get; set; }
    }

    public class EPAObservationCountOriginal
    {
        public string[] Categories { get; set; }
        public string[] Data { get; set; }
    }

问题2解决方法是在函数中添加“return”二字:

var epadatasource = []; for(var i=0;i<angular.element($('#EPAChart')).scope().$parent.vm['epaGraphData'].Categories.length;i++){epadatasource.push({category: angular.element($('#EPAChart')).scope().$parent.vm['epaGraphData'].Categories[i], data: angular.element($('#EPAChart')).scope().$parent.vm['epaGraphData'].Data[i]}); }; return JSON.stringify(epadatasource);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2011-09-09
    • 2013-02-02
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多