XML解析和自动化

时间:2017-03-17 18:59:44

标签: c# xml selenium linq-to-xml

除了我为工作编写的自动化之外,我从来没有真正需要使用XML。也许我做错了,或者我刚刚......幸运?

话虽这么说,我在解析XML文件时遇到了一些麻烦。 XML的结构如下所示:

// I have removed the username and passwords as they are sensitive
<?xml version="1.0" encoding="UTF-8"?>
<Logins>
   <Login>
      <Username>xxx</Username>
      <Password>xxx</Password>
   </Login>
...
</Logins>

足够简单。我需要做的是从每个节点中提取用户名和密码,并将它们分成两个单独的变量。之后,我有一些自动代码可以找到3个元素(用户名,密码,提交按钮),并相应地与它们进行交互以登录。然后我进行冒烟测试以检查图像并关闭浏览器。那段代码在这里:

chromeDriver.FindElement(By.Id(@"userNameInput")).SendKeys(userName.ToString());
chromeDriver.FindElement(By.Id(@"passwordInput")).SendKeys(passWord.ToString());
chromeDriver.FindElement(By.Id(@"submitButton")).Click();
Thread.Sleep(10);
bool isVisible = chromeDriver.FindElement(By.Id(@"logoImage")).Displayed;

您可以确定,我需要使用的变量是userNamepassWord。我试过的代码,无论如何,(以及其他尝试)都在这里:

XDocument rootElement = XDocument.Load(@"C:\Test Data.xml");

IEnumerable<string> textSegment =
   from segment in rootElement.Descendants("Username")
   select (string)segment;

var userName = textSegment;

我得到的输出是:

  

System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement,System.String]

这是正在写入/发送到用户名字段的文字输出,而我完全不知道我在这一点上做错了什么。我知道在解析XML时我做错了。

2 个答案:

答案 0 :(得分:1)

试试这个

var result = rootElement.Descendants("Login").Select(lg =>
                   new {
                         user = lg.Element("Username").Value,
                         password = lg.Element("Password").Value
                        });

您尝试将XElement类型的对象转换为字符串,您应该改为使用其值。

答案 1 :(得分:1)

所以,在 CPR43 Stinky Towel (谢谢你们两位)的帮助下,我能够为我的问题找到解决方案:

using System.Xml.Linq;
using System.Threading;
using System.Linq;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace MCESA_SmokeTest
{
   public class SmokeTest
   {
      IWebDriver chromeDriver = new ChromeDriver(@"C:\Users\xxxxx\Selenium Stuff\Drivers");

      [Test]
      public void NavigateToHomePageInProduction()
      {
         chromeDriver.Navigate().GoToUrl(@"https://xxx.xxx.xxx/XXXX");
         chromeDriver.Manage().Window.Maximize();

         XDocument rootElement = XDocument.Load(@"C:\Test Data.xml");

         var result = rootElement.Descendants("Login").Select(lg =>
              new
              {
                 user = lg.Element("Username").Value,
                 password = lg.Element("Password").Value
              });

         foreach (var temp in result)
         {
            chromeDriver.FindElement(By.Id(@"userNameInput")).SendKeys(temp.user);
            chromeDriver.FindElement(By.Id(@"passwordInput")).SendKeys(temp.password);
            chromeDriver.FindElement(By.Id(@"submitButton")).Click();
            Thread.Sleep(10);
            bool isVisible = chromeDriver.FindElement(By.Id(@"logoImage")).Displayed;
            isVisible = chromeDriver.FindElement(By.ClassName(@"Header_mcesa")).Displayed;
            chromeDriver.FindElement(By.Id(@"logout")).Click();
         }
         chromeDriver.Quit();
      }  
   }
}

希望这可以帮助像我这样LinQ-to-XML的新人。