Selenium c#::哪种文件类型可以用于对象存储库以获得更好的性能

本文关键字:存储 更好 性能 对象 用于 文件 类型 Selenium | 更新日期: 2023-09-27 18:03:23

我正在使用Selenium c#创建一个自动化框架,目前我正在研究对象存储库部分。所以我想知道我可以使用什么类型的文件作为对象存储库。目前我正在考虑使用XML或Excel,但我不确定哪一个性能更好,所以你们中的任何一个都可以分享你的观点,并让我知道是否有任何其他选择。

我计划使用XmlDocument读取xml和oledb连接读取excel。

Selenium c#::哪种文件类型可以用于对象存储库以获得更好的性能

我认为你指的是不同的元素,它们的定位器和其他一些必需的属性,因为据我所知硒本身没有对象存储库的概念。

如果是这样,你需要考虑谁来维护这个仓库,对于几千个定位器,而不是性能可维护性将是一个主要问题。

另外,考虑通过实现一个接口来隔离它,这样在将来如果你因为任何问题决定改变实现,它不会影响你的框架。

XML, Excel,文本文件(带任何分隔符),数据库,json文件都是很好的竞争者。

默认情况下Selenium不能处理XML页面,因为浏览器不会将XML文件显示为XML,而是将其显示为转换为html文件。

对于这个任务,我使用了以下代码(它基于htmlilitypack):

XmlActions.cs

namespace BotAgent.Ifrit.Core.Xml
{
    using HtmlAgilityPack;
    public partial class XmlActions
    {
        private HtmlDocument _xmlDoc;
        private HtmlNode _rootNode;
        public XmlActions()
        {
            _xmlDoc = new HtmlDocument();
        }
        private void Update()
        {
            string pageSource = Brwsr.CurrPage.PageSource.Replace("'r'n", string.Empty);
            _xmlDoc.LoadHtml(pageSource);
            _rootNode = _xmlDoc.DocumentNode;
        }
        public NodeSingle Elmnt(string xpath)
        {
            Update();
            var currNode = _rootNode.SelectSingleNode(xpath);
            return new NodeSingle(currNode);
        }
        public NodesMultiple Elmnts(string xpath)
        {
            Update();
            var nodesGroup = _rootNode.SelectNodes(xpath);
            return new NodesMultiple(nodesGroup);
        }
    }
}

XmlActions.NodeSingle.cs

using System;
namespace BotAgent.Ifrit.Core.Xml
{
    using HtmlAgilityPack;
    partial class XmlActions
    {
        public class NodeSingle
        {
            private readonly HtmlNode _currNode;
            public string Text
            {
                get
                {
                    return CleanUpStringFromXml(_currNode.InnerText);
                }
            }
            public string TagName
            {
                get
                {
                    return _currNode.OriginalName;
                }
            }
            public string XmlInner
            {
                get
                {
                    return _currNode.InnerHtml;
                }
            }
            public string XmlOuter
            {
                get
                {
                    return _currNode.OuterHtml;
                }
            }
            public NodeSingle(HtmlNode currentNode)
            {
                _currNode = currentNode;
            }
            public bool Exist()
            {
                if (_currNode == null)
                {
                    return false;
                }
                return true;
            }
            public bool AttributesExist()
            {
                return _currNode.HasAttributes;
            }
            public bool AttributeExist(string attributeName)
            {
                if (_currNode.Attributes[attributeName] != null)
                {
                    return true;
                }
                return false;
            }
            public string AttributeValue(string attrName)
            {
                return _currNode.GetAttributeValue(attrName, string.Empty);
            }
            public bool HaveChildren()
            {
                var firstChildNode = _currNode.FirstChild;
                if (firstChildNode != null)
                {
                    return true;
                }
                return false;
            }
            public NodeSingle FirstChild()
            {
                HtmlNode node = null;
                try
                {
                    node = _currNode.ChildNodes[1];
                }
                catch (Exception)
                {
                    //// No need to throw exception, its normal if there are no child
                }

                return new NodeSingle(node);
            }
            public NodeSingle Parent()
            {
                return new NodeSingle(_currNode.ParentNode);
            }
            private string CleanUpStringFromXml(string xml)
            {
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(xml);
                var root = doc.DocumentNode;
                root.RemoveAllChildren();
                return root.OuterHtml.Replace(" ", string.Empty);
            }
        }
    }
}

XmlActions。NodesMultiple

namespace BotAgent.Ifrit.Core.Xml
{
    using System.Collections.Generic;
    using System.Linq;
    using HtmlAgilityPack;
    partial class XmlActions
    {
        public class NodesMultiple
        {
            private readonly HtmlNodeCollection _nodesGroup;
            public int Count
            {
                get
                {
                    return _nodesGroup.Count;
                }
            }
            public NodesMultiple(HtmlNodeCollection nodesGroup)
            {
                this._nodesGroup = nodesGroup;
            }
            public NodeSingle GetElementByIndex(int index)
            {
                var singleNode = _nodesGroup.ElementAt(index);
                return new NodeSingle(singleNode);
            }
            public List<NodeSingle> GetAll()
            {
                return _nodesGroup.Select(node => new NodeSingle(node)).ToList();
            }
        }
    }
}

我在这里使用了我自己的框架代码,但这一定不会给你改变它来清除硒代码带来问题。

之后,你可以用浏览器实例创建静态XML变量,像这样使用:

bool isIdExist = Brwsr.Xml.Elem(".//div[1]").AttributeExist("id");

bool haveChild = Brwsr.Xml.Elem(".//div[1]").FirstChild().Exist;