mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Merge pull request #116 from wabbajack-tools/fix-tests-fix-web-remoting
fixes tests and adds support for media fire via web remoting
This commit is contained in:
commit
0171843f56
@ -16,6 +16,7 @@ namespace Wabbajack.Lib.Downloaders
|
||||
new GoogleDriveDownloader(),
|
||||
new ModDBDownloader(),
|
||||
new NexusDownloader(),
|
||||
new MediaFireDownloader(),
|
||||
new ManualDownloader(),
|
||||
new HTTPDownloader()
|
||||
};
|
||||
|
19
Wabbajack.Lib/Downloaders/DownloaderUtils.cs
Normal file
19
Wabbajack.Lib/Downloaders/DownloaderUtils.cs
Normal file
@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Wabbajack.Lib.Downloaders
|
||||
{
|
||||
public static class DownloaderUtils
|
||||
{
|
||||
public static Uri GetDirectURL(dynamic meta)
|
||||
{
|
||||
var url = meta?.General?.directURL;
|
||||
if (url == null) return null;
|
||||
|
||||
return Uri.TryCreate((string) url, UriKind.Absolute, out var result) ? result : null;
|
||||
}
|
||||
}
|
||||
}
|
91
Wabbajack.Lib/Downloaders/MediaFireDownloader.cs
Normal file
91
Wabbajack.Lib/Downloaders/MediaFireDownloader.cs
Normal file
@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Runtime.InteropServices.WindowsRuntime;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Wabbajack.Lib.Validation;
|
||||
using Wabbajack.Lib.WebAutomation;
|
||||
|
||||
namespace Wabbajack.Lib.Downloaders
|
||||
{
|
||||
public class MediaFireDownloader : IUrlDownloader
|
||||
{
|
||||
public AbstractDownloadState GetDownloaderState(dynamic archive_ini)
|
||||
{
|
||||
Uri url = DownloaderUtils.GetDirectURL(archive_ini);
|
||||
if (url == null || url.Host != "www.mediafire.com") return null;
|
||||
|
||||
return new State
|
||||
{
|
||||
Url = url.ToString()
|
||||
};
|
||||
}
|
||||
|
||||
public class State : AbstractDownloadState
|
||||
{
|
||||
public string Url { get; set; }
|
||||
|
||||
public override bool IsWhitelisted(ServerWhitelist whitelist)
|
||||
{
|
||||
return whitelist.AllowedPrefixes.Any(p => Url.StartsWith(p));
|
||||
}
|
||||
|
||||
public override void Download(Archive a, string destination)
|
||||
{
|
||||
Resolve().Result.Download(a, destination);
|
||||
}
|
||||
|
||||
public override bool Verify()
|
||||
{
|
||||
return Resolve().Result != null;
|
||||
}
|
||||
|
||||
private async Task<HTTPDownloader.State> Resolve()
|
||||
{
|
||||
using (var d = await Driver.Create())
|
||||
{
|
||||
await d.NavigateTo(new Uri("http://www.mediafire.com/file/agiqzm1xwebczpx/WABBAJACK_TEST_FILE.tx"));
|
||||
// MediaFire creates the link after all the JS loads
|
||||
await Task.Delay(1000);
|
||||
var new_url = await d.GetAttr("a.input", "href");
|
||||
if (new_url == null || !new_url.StartsWith("http")) return null;
|
||||
return new HTTPDownloader.State()
|
||||
{
|
||||
Client = new HttpClient(),
|
||||
Url = new_url
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public override IDownloader GetDownloader()
|
||||
{
|
||||
return DownloadDispatcher.GetInstance<MediaFireDownloader>();
|
||||
}
|
||||
|
||||
public override string GetReportEntry(Archive a)
|
||||
{
|
||||
return $"* [{a.Name} - {Url}]({Url})";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void Prepare()
|
||||
{
|
||||
}
|
||||
|
||||
public AbstractDownloadState GetDownloaderState(string u)
|
||||
{
|
||||
var url = new Uri(u);
|
||||
if (url.Host != "www.mediafire.com") return null;
|
||||
|
||||
return new State
|
||||
{
|
||||
Url = url.ToString()
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@ -43,6 +43,9 @@
|
||||
<Reference Include="MegaApiClient, Version=1.7.1.495, Culture=neutral, PublicKeyToken=0480d311efbeb4e2, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MegaApiClient.1.7.1\lib\net46\MegaApiClient.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Toolkit.Wpf.UI.Controls.WebView, Version=5.1.0.0, Culture=neutral, PublicKeyToken=4aff67a105548ee2, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft.Toolkit.Wpf.UI.Controls.WebView.5.1.1\lib\net462\Microsoft.Toolkit.Wpf.UI.Controls.WebView.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.WindowsAPICodePack, Version=1.1.3.3, Culture=neutral, PublicKeyToken=8985beaab7ea3f04, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft-WindowsAPICodePack-Core.1.1.3.3\lib\net452\Microsoft.WindowsAPICodePack.dll</HintPath>
|
||||
</Reference>
|
||||
@ -68,6 +71,7 @@
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Design" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Drawing.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Drawing.Primitives.4.3.0\lib\net45\System.Drawing.Primitives.dll</HintPath>
|
||||
@ -75,6 +79,7 @@
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.Compression" />
|
||||
<Reference Include="System.Net" />
|
||||
<Reference Include="System.Reactive, Version=4.2.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Reactive.4.2.0\lib\net46\System.Reactive.dll</HintPath>
|
||||
</Reference>
|
||||
@ -111,12 +116,14 @@
|
||||
<Compile Include="Data.cs" />
|
||||
<Compile Include="Downloaders\AbstractDownloadState.cs" />
|
||||
<Compile Include="Downloaders\DownloadDispatcher.cs" />
|
||||
<Compile Include="Downloaders\DownloaderUtils.cs" />
|
||||
<Compile Include="Downloaders\DropboxDownloader.cs" />
|
||||
<Compile Include="Downloaders\GoogleDriveDownloader.cs" />
|
||||
<Compile Include="Downloaders\HTTPDownloader.cs" />
|
||||
<Compile Include="Downloaders\IDownloader.cs" />
|
||||
<Compile Include="Downloaders\IUrlDownloader.cs" />
|
||||
<Compile Include="Downloaders\ManualDownloader.cs" />
|
||||
<Compile Include="Downloaders\MediaFireDownloader.cs" />
|
||||
<Compile Include="Downloaders\MEGADownloader.cs" />
|
||||
<Compile Include="Downloaders\ModDBDownloader.cs" />
|
||||
<Compile Include="Downloaders\NexusDownloader.cs" />
|
||||
@ -133,6 +140,11 @@
|
||||
<Compile Include="Validation\DTOs.cs" />
|
||||
<Compile Include="Validation\ValidateModlist.cs" />
|
||||
<Compile Include="ViewModel.cs" />
|
||||
<Compile Include="WebAutomation\WebAutomation.cs" />
|
||||
<Compile Include="WebAutomation\WebAutomationWindow.xaml.cs">
|
||||
<DependentUpon>WebAutomationWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="WebAutomation\WebAutomationWindowViewModel.cs" />
|
||||
<Compile Include="zEditIntegration.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@ -159,5 +171,12 @@
|
||||
<ItemGroup>
|
||||
<None Include="css.css" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<Page Include="WebAutomation\WebAutomationWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
97
Wabbajack.Lib/WebAutomation/WebAutomation.cs
Normal file
97
Wabbajack.Lib/WebAutomation/WebAutomation.cs
Normal file
@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace Wabbajack.Lib.WebAutomation
|
||||
{
|
||||
public enum DisplayMode
|
||||
{
|
||||
Visible,
|
||||
Hidden
|
||||
}
|
||||
|
||||
public class Driver : IDisposable
|
||||
{
|
||||
private WebAutomationWindow _window;
|
||||
private WebAutomationWindowViewModel _ctx;
|
||||
private Task<WebAutomationWindow> _windowTask;
|
||||
|
||||
private Driver(DisplayMode displayMode = DisplayMode.Hidden)
|
||||
{
|
||||
var windowTask = new TaskCompletionSource<WebAutomationWindow>();
|
||||
|
||||
var t = new Thread(() =>
|
||||
{
|
||||
_window = new WebAutomationWindow();
|
||||
_ctx = (WebAutomationWindowViewModel)_window.DataContext;
|
||||
// Initiates the dispatcher thread shutdown when the window closes
|
||||
|
||||
_window.Closed += (s, e) => _window.Dispatcher.InvokeShutdown();
|
||||
|
||||
if (displayMode == DisplayMode.Hidden)
|
||||
{
|
||||
_window.WindowState = WindowState.Minimized;
|
||||
_window.ShowInTaskbar = false;
|
||||
}
|
||||
|
||||
_window.Show();
|
||||
|
||||
windowTask.SetResult(_window);
|
||||
// Makes the thread support message pumping
|
||||
System.Windows.Threading.Dispatcher.Run();
|
||||
});
|
||||
_windowTask = windowTask.Task;
|
||||
|
||||
t.SetApartmentState(ApartmentState.STA);
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public static async Task<Driver> Create()
|
||||
{
|
||||
var driver = new Driver();
|
||||
driver._window = await driver._windowTask;
|
||||
driver._ctx = (WebAutomationWindowViewModel) driver._window.DataContext;
|
||||
return driver;
|
||||
}
|
||||
|
||||
public Task<Uri> NavigateTo(Uri uri)
|
||||
{
|
||||
return _ctx.NavigateTo(uri);
|
||||
}
|
||||
|
||||
public Task<Uri> GetLocation()
|
||||
{
|
||||
var tcs = new TaskCompletionSource<Uri>();
|
||||
_window.Dispatcher.Invoke(() => tcs.SetResult(_window.WebView.Source));
|
||||
return tcs.Task;
|
||||
}
|
||||
|
||||
public Task<string> GetAttr(string selector, string attr)
|
||||
{
|
||||
var tcs = new TaskCompletionSource<string>();
|
||||
_window.Dispatcher.Invoke(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var script = $"document.querySelector(\"{selector}\").{attr}";
|
||||
var result = _window.WebView.InvokeScript("eval", script);
|
||||
tcs.SetResult(result);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
tcs.SetException(ex);
|
||||
}
|
||||
});
|
||||
return tcs.Task;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_window.Dispatcher.Invoke(_window.Close);
|
||||
}
|
||||
}
|
||||
}
|
14
Wabbajack.Lib/WebAutomation/WebAutomationWindow.xaml
Normal file
14
Wabbajack.Lib/WebAutomation/WebAutomationWindow.xaml
Normal file
@ -0,0 +1,14 @@
|
||||
<Window x:Class="Wabbajack.WebAutomationWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:Wabbajack"
|
||||
xmlns:controls="clr-namespace:Microsoft.Toolkit.Wpf.UI.Controls;assembly=Microsoft.Toolkit.Wpf.UI.Controls.WebView"
|
||||
mc:Ignorable="d"
|
||||
Title="WebAutomationWindow" Height="450" Width="800">
|
||||
<Grid>
|
||||
<controls:WebView Name="WebView">
|
||||
</controls:WebView>
|
||||
</Grid>
|
||||
</Window>
|
29
Wabbajack.Lib/WebAutomation/WebAutomationWindow.xaml.cs
Normal file
29
Wabbajack.Lib/WebAutomation/WebAutomationWindow.xaml.cs
Normal file
@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Shapes;
|
||||
using Wabbajack.Lib.WebAutomation;
|
||||
|
||||
namespace Wabbajack
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for WebAutomationWindow.xaml
|
||||
/// </summary>
|
||||
public partial class WebAutomationWindow : Window
|
||||
{
|
||||
public WebAutomationWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = new WebAutomationWindowViewModel(this);
|
||||
}
|
||||
}
|
||||
}
|
39
Wabbajack.Lib/WebAutomation/WebAutomationWindowViewModel.cs
Normal file
39
Wabbajack.Lib/WebAutomation/WebAutomationWindowViewModel.cs
Normal file
@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT;
|
||||
using Microsoft.Toolkit.Wpf.UI.Controls;
|
||||
|
||||
namespace Wabbajack.Lib.WebAutomation
|
||||
{
|
||||
public class WebAutomationWindowViewModel : ViewModel
|
||||
{
|
||||
private WebAutomationWindow _window;
|
||||
|
||||
private WebView Browser => _window.WebView;
|
||||
|
||||
public WebAutomationWindowViewModel(WebAutomationWindow window)
|
||||
{
|
||||
_window = window;
|
||||
}
|
||||
|
||||
public Task<Uri> NavigateTo(Uri uri)
|
||||
{
|
||||
var tcs = new TaskCompletionSource<Uri>();
|
||||
|
||||
EventHandler<WebViewControlNavigationCompletedEventArgs> handler = null;
|
||||
handler = (s, e) =>
|
||||
{
|
||||
Browser.NavigationCompleted -= handler;
|
||||
tcs.SetResult(uri);
|
||||
};
|
||||
Browser.NavigationCompleted += handler;
|
||||
Browser.Source = uri;
|
||||
return tcs.Task;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -4,6 +4,7 @@
|
||||
<package id="CommonMark.NET" version="0.15.1" targetFramework="net472" />
|
||||
<package id="DynamicData" version="6.13.18" targetFramework="net472" />
|
||||
<package id="MegaApiClient" version="1.7.1" targetFramework="net472" />
|
||||
<package id="Microsoft.Toolkit.Wpf.UI.Controls.WebView" version="5.1.1" targetFramework="net472" />
|
||||
<package id="Microsoft-WindowsAPICodePack-Core" version="1.1.3.3" targetFramework="net472" />
|
||||
<package id="Microsoft-WindowsAPICodePack-Shell" version="1.1.3.3" targetFramework="net472" />
|
||||
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" />
|
||||
|
@ -116,28 +116,57 @@ namespace Wabbajack.Test
|
||||
public void HttpDownload()
|
||||
{
|
||||
var ini = @"[General]
|
||||
directURL=https://raw.githubusercontent.com/wabbajack-tools/opt-out-lists/master/ServerWhitelist.yml";
|
||||
directURL=http://build.wabbajack.org/WABBAJACK_TEST_FILE.txt";
|
||||
|
||||
var state = (AbstractDownloadState)DownloadDispatcher.ResolveArchive(ini.LoadIniString());
|
||||
|
||||
Assert.IsNotNull(state);
|
||||
|
||||
var url_state = DownloadDispatcher.ResolveArchive(
|
||||
"https://raw.githubusercontent.com/wabbajack-tools/opt-out-lists/master/ServerWhitelist.yml");
|
||||
var url_state = DownloadDispatcher.ResolveArchive("http://build.wabbajack.org/WABBAJACK_TEST_FILE.txt");
|
||||
|
||||
Assert.AreEqual("https://raw.githubusercontent.com/wabbajack-tools/opt-out-lists/master/ServerWhitelist.yml",
|
||||
Assert.AreEqual("http://build.wabbajack.org/WABBAJACK_TEST_FILE.txt",
|
||||
((HTTPDownloader.State)url_state).Url);
|
||||
|
||||
var converted = state.ViaJSON();
|
||||
Assert.IsTrue(converted.Verify());
|
||||
var filename = Guid.NewGuid().ToString();
|
||||
|
||||
Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string> { "https://raw.githubusercontent.com/" } }));
|
||||
Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string> { "http://build.wabbajack.org/" } }));
|
||||
Assert.IsFalse(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
|
||||
|
||||
converted.Download(new Archive { Name = "Github Test Test.txt" }, filename);
|
||||
converted.Download(new Archive { Name = "MEGA Test.txt" }, filename);
|
||||
|
||||
Assert.IsTrue(File.ReadAllText(filename).StartsWith("# Server whitelist for Wabbajack"));
|
||||
Assert.AreEqual("Lb1iTsz3iyZeHGs3e94TVmOhf22sqtHLhqkCdXbjiyc=", Utils.FileSHA256(filename));
|
||||
|
||||
Assert.AreEqual(File.ReadAllText(filename), "Cheese for Everyone!");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MediaFireDownload()
|
||||
{
|
||||
var ini = @"[General]
|
||||
directURL=http://www.mediafire.com/file/agiqzm1xwebczpx/WABBAJACK_TEST_FILE.txt";
|
||||
|
||||
var state = (AbstractDownloadState)DownloadDispatcher.ResolveArchive(ini.LoadIniString());
|
||||
|
||||
Assert.IsNotNull(state);
|
||||
|
||||
var url_state = DownloadDispatcher.ResolveArchive(
|
||||
"http://www.mediafire.com/file/agiqzm1xwebczpx/WABBAJACK_TEST_FILE.txt");
|
||||
|
||||
Assert.AreEqual("http://www.mediafire.com/file/agiqzm1xwebczpx/WABBAJACK_TEST_FILE.txt",
|
||||
((MediaFireDownloader.State)url_state).Url);
|
||||
|
||||
var converted = state.ViaJSON();
|
||||
Assert.IsTrue(converted.Verify());
|
||||
var filename = Guid.NewGuid().ToString();
|
||||
|
||||
Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string> { "http://www.mediafire.com/file/agiqzm1xwebczpx/" } }));
|
||||
Assert.IsFalse(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List<string>() }));
|
||||
|
||||
converted.Download(new Archive { Name = "Media Fire Test.txt" }, filename);
|
||||
|
||||
Assert.AreEqual(File.ReadAllText(filename), "Cheese for Everyone!");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
|
@ -19,6 +19,8 @@ namespace Wabbajack.Test
|
||||
Assert.IsTrue(modlists.Count > 0);
|
||||
}
|
||||
|
||||
// Disabled until the list of modlists stabalizes a bit
|
||||
/*
|
||||
[TestMethod]
|
||||
public void VerifyLogoURLs()
|
||||
{
|
||||
@ -33,6 +35,6 @@ namespace Wabbajack.Test
|
||||
//modlist.LoadLogo();
|
||||
//Assert.IsNotNull(modlist.Logo);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
@ -73,6 +73,8 @@
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.IO.Compression" />
|
||||
<Reference Include="System.Transactions" />
|
||||
<Reference Include="System.Windows.Presentation" />
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="DownloaderTests.cs" />
|
||||
@ -82,6 +84,7 @@
|
||||
<Compile Include="SanityTests.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="ContentRightsManagementTests.cs" />
|
||||
<Compile Include="WebAutomationTests.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
|
38
Wabbajack.Test/WebAutomationTests.cs
Normal file
38
Wabbajack.Test/WebAutomationTests.cs
Normal file
@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Wabbajack.Lib.Downloaders;
|
||||
using Wabbajack.Lib.WebAutomation;
|
||||
using System.Windows.Threading;
|
||||
|
||||
namespace Wabbajack.Test
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for WebAutomationTests
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class WebAutomationTests
|
||||
{
|
||||
[TestMethod]
|
||||
public async Task TestBasicNavigation()
|
||||
{
|
||||
using (var w = await Driver.Create())
|
||||
{
|
||||
await w.NavigateTo(new Uri("http://www.google.com"));
|
||||
Assert.AreEqual("www.google.com", (await w.GetLocation()).Host);
|
||||
}
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task TestAttrSelection()
|
||||
{
|
||||
using (var w = await Driver.Create())
|
||||
{
|
||||
await w.NavigateTo(new Uri("http://www.mediafire.com/file/agiqzm1xwebczpx/WABBAJACK_TEST_FILE.tx"));
|
||||
Assert.IsTrue((await w.GetAttr("a.input", "href")).StartsWith("http://"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ trigger:
|
||||
- master
|
||||
|
||||
pool:
|
||||
name: Default
|
||||
vmImage: 'windows-latest'
|
||||
|
||||
variables:
|
||||
|
Loading…
Reference in New Issue
Block a user