2015-01-02 32 views
0

我试图检索一个OneNote页面创建一个集成测试。并试图使用LiveSDK 5.6 LiveAuthClient的时候,我的编译器甚至没有看到一个名为LiveAuthClient.LoginAsync这是在多个答案(例如1)在这里提到还有MSDN任何方法(〜应变[]):|LiveSDK 5.6 LiveAuthClient.LoginAsync方法缺少

 var authClient = new LiveAuthClient(OneNoteApiConfig.ClientID); 

     var result = await authClient.InitializeAsync(OneNoteApiConfig.Scopes); 

     if (result.Status != LiveConnectSessionStatus.Connected) 
     { 
      result = await authClient.LoginAsync(Scopes); // method does not exist 
     } 

任何想法?

我敢肯定,我失去了一些东西明显

有似乎是一个被称为GetLoginUrl()的方法?

我是引用了错误的LiveSDK?

我安装了LiveSDK 5.6 NuGet包,该项目是一个.NET 4.5类库项目

回答

3

我设法让它工作,但不得不使用GetLoginUrl(),而不是使用Selenium使用测试帐户登录到实时窗口并批准权限请求,然后使用查询字符串中的代码重定向(..?代码= xx.xxx),我用它来打电话与AuthClient.ExchangeAuthCodeAsync,并获得了会议,其中包括一个的accessToken + RefreshToken,对于所有其他测试中,我可以使用刷新标记:-)因为它是有效的年。

[Test] 
    public async void TryAuthoriseWithMsLiveLibrary() 
    { 
     var authClient = new LiveAuthClient(OneNoteApiConfig.ClientID); 

     var result = await authClient.InitializeAsync(OneNoteApiConfig.Scopes); 

     var getLoginUrl = authClient.GetLoginUrl(OneNoteApiConfig.Scopes); 
     Console.WriteLine("\r\nGetLoginUrl = " + getLoginUrl); 

     // New selenium Driver 
     _driver = new FirefoxDriver(); 

     //Set wait to 2 seconds by defualt 
     _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(2)); 

     // Go to the url provided by auth client 
     _driver.Navigate().GoToUrl(getLoginUrl); 

     // Try find the accept button, if automatically directed to the "Grant Permission page", otherwise try find the Login/Passwd and login first 
     try 
     { 
      _driver.FindElementById("idBtn_Accept"); 
     } 
     catch (NoSuchElementException) 
     { 
      var un = _driver.FindElementByName("login"); // Login TextBox 
      var pw = _driver.FindElementByName("passwd"); // Password TextBox 
      var signIn = _driver.FindElementByName("SI"); // Sign-In Button 

      un.SendKeys(OneNoteTestConfig.WindowsLiveUsername); 
      pw.SendKeys(OneNoteTestConfig.WindowsLivePassword); 
      signIn.Submit(); 
     } 
     // Find a click the idBtn_Accept, if not found straight away, will implictly wait 2 seconds as set baove 
     var button = _driver.FindElementById("idBtn_Accept"); 
     button.Click(); 

     // Try wait until the client is successfully redirected to the url with the code 
     try 
     { 
      var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(5)); 
      wait.Until(d => d.Url.StartsWith("https://login.live.com/oauth20_desktop.srf")); 
      //example https://login.live.com/oauth20_desktop.srf?code=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&lc=1033 
     } 
     catch (WebDriverTimeoutException) 
     { 
      Console.WriteLine(_driver.Url); 
      throw; 
     } 

     Console.WriteLine("\r\nUrl = " + _driver.Url); 

     // Retrieve code from query string (?code=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&...) 
     var code = MsLiveAuthHelper.GetSessionCodeFromRedirectedUrl(_driver.Url); 

     code.Should().NotBeNull(); 
     Console.WriteLine("\r\ncode = " + code); 

     // Try get open a session using retrieved code. 
     // From my uynderstanding you can only do this once with the code, as it expired after 
     // and need to use the refresh token from this point, or re-request a code using above procedure 
     var session = await authClient.ExchangeAuthCodeAsync(code); 

     session.Should().NotBeNull(); 
     session.AccessToken.Should().NotBeNullOrWhiteSpace(); 

     Console.WriteLine("\r\nLiveConnectSession.AccessToken = " + session.AccessToken); 
     Console.WriteLine("\r\nLiveConnectSession.AuthenticationToken = " + session.AuthenticationToken); 
     Console.WriteLine("\r\nLiveConnectSession.Expires = " + session.Expires); 
     Console.WriteLine("\r\nLiveConnectSession.RefreshToken = " + session.RefreshToken); 
    } 

对于我的其他测试,res.RefreshToken并有TestRefreshTokenHandler : IRefreshTokenHandler,我将它保存在:

public class TestRefreshTokenHandler : IRefreshTokenHandler 
{ 
    public Task SaveRefreshTokenAsync(RefreshTokenInfo tokenInfo) 
    { 
     return Task.Factory.StartNew(() => 
     { 
      Console.WriteLine("------------------------"); 

      Console.WriteLine("\r\nUserID = " + tokenInfo.UserId); 
      Console.WriteLine("\r\nRefresh Token = " + tokenInfo.RefreshToken); 

      Console.WriteLine("\r\n------------------------"); 
     }); 
    } 

    public Task<RefreshTokenInfo> RetrieveRefreshTokenAsync() 
    { 
     Console.WriteLine("RetrieveRefreshTokenAsync()"); 
     return Task.FromResult(new RefreshTokenInfo(OneNoteTestConfig.OneNoteRefreshToken)); 
    } 
} 

最后,在其他测试:

[Test] 
    public async void GetNewTokenByRefresh() 
    { 
     var authClient = new LiveAuthClient(OneNoteApiConfig.ClientID, new TestRefreshTokenHandler()); 
     var res = (await authClient.InitializeAsync(OneNoteApiConfig.Scopes)).Session; 

     Console.WriteLine("\r\nLiveConnectSession.AccessToken = " + res.AccessToken); 
     Console.WriteLine("\r\nLiveConnectSession.AuthenticationToken = " + res.AuthenticationToken); 
     Console.WriteLine("\r\nLiveConnectSession.Expires = " + res.Expires); 
     Console.WriteLine("\r\nLiveConnectSession.RefreshToken = " + res.RefreshToken); 
     res.AuthenticationToken.Should().NotBeNullOrWhiteSpace(); 
    } 

希望这可以帮助别人!

1

我不认为登录工作流从与现场SDK一个桌面应用程序的支持,只有从Windows存储应用。您可能必须下载到REST API进行自动化测试。

+0

做了进一步的调查,并尝试了一点+错误+运气,我设法让它工作,但不得不使用GetLoginUrl(),而不是使用Selenium使用测试帐户登录到实时窗口并批准权限请求,然后把它用在查询字符串代码(..?代码= xx.xxx),我用它来打电话与AuthClient.ExchangeAuthCodeAsync,并获得了会议,其中包括一个的accessToken + RefreshToken重定向,对于所有其他测试我可以使用该刷新标记:-),因为它有效期为一年。看到我即将发布的答案。 –