2017-03-17 59 views
0

除了我爲工作編寫的自動化外,我從來沒有真的需要使用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 [系統.Xml.Linq.XElement,System.String]

這是正在寫/發送到用戶名字段的文字輸出,我完全不知道我在做什麼錯誤在這一點上。我知道我在解析XML時做錯了什麼。

+1

是否** var userName = textSegment.ToList()**獲取所需內容? –

回答

1

試試這個

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

您試圖類型的XElement的對象轉換爲字符串,你應該把它的值來代替。

+0

這讓我在正確的道路上思考。完成後,我會發布完整的答案代碼。非常感謝,@ CPR43! – Brian

1

所以,用CPR43臭毛巾的幫助(謝謝你們),我能想出這個解決我的問題:

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的新功能。