Selenium c#::哪种文件类型可以用于对象存储库以获得更好的性能
本文关键字:存储 更好 性能 对象 用于 文件 类型 Selenium | 更新日期: 2023-09-27 18:03:23
我正在使用Selenium c#创建一个自动化框架,目前我正在研究对象存储库部分。所以我想知道我可以使用什么类型的文件作为对象存储库。目前我正在考虑使用XML或Excel,但我不确定哪一个性能更好,所以你们中的任何一个都可以分享你的观点,并让我知道是否有任何其他选择。
我计划使用XmlDocument读取xml和oledb连接读取excel。
我认为你指的是不同的元素,它们的定位器和其他一些必需的属性,因为据我所知硒本身没有对象存储库的概念。
如果是这样,你需要考虑谁来维护这个仓库,对于几千个定位器,而不是性能可维护性将是一个主要问题。
另外,考虑通过实现一个接口来隔离它,这样在将来如果你因为任何问题决定改变实现,它不会影响你的框架。
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;