Selenium WebDriver C# NUnit 测试并行失败
Selenium WebDriver C# NUnit Tests Failing in Parallel
更新请见底部!
我正在设置我的框架,目前有 4 个测试。就个人而言,他们都 运行 喜欢魅力。但是,当我尝试 运行 所有 4 个并行时 (我已经正确设置了 Parallelizable 属性,并且正在从不在同一方法中的不同 classes 调用测试) 我一直收到几个错误,这些错误似乎在每次测试中都会出现。这些是我收到的每个消息 运行:
再次 运行 单独测试时会发现这些对象。我不确定我需要显示什么代码才能提供帮助。请指教
更新** @Chris 我的怀疑是一样的。我认为我的测试在查找对象时混淆了同一个驱动程序。如果是这种情况,有人可以建议如何更好地处理这个问题,我的浏览器 class 正在调用驱动程序。
public static class Browser
{
private static IWebDriver driver;
private static string baseURL = "someURL";
public static ISearchContext Driver { get { return driver; } }
internal static bool WaitUntilElementIsDisplayed(By element, int timeout)
{
for (int i = 0; i < timeout; i++)
{
if (ElementIsDisplayed(element))
{
return true;
}
Thread.Sleep(1000);
}
return false;
}
internal static IWebElement FindElement(By by)
{
return driver.FindElement(by);
}
public static bool ElementIsDisplayed(By element)
{
var present = false;
driver.Manage().Timeouts().ImplicitlyWait(System.TimeSpan.FromSeconds(0));
try
{
present = driver.FindElement(element).Displayed;
}
catch (NoSuchElementException)
{ }
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
return present;
}
public static void Initialize()
{
var options = new InternetExplorerOptions();
options.IntroduceInstabilityByIgnoringProtectedModeSettings = true;
options.EnsureCleanSession = true;
options.IgnoreZoomLevel = true;
driver =
new InternetExplorerDriver(
@"C:Myfilepath",
options, TimeSpan.FromMinutes(10));
Goto("");
}
public static void CleanUp()
{
driver.Close();
driver.Quit();
}
public static void Goto(string URL, bool userBaseURL = true)
{
if (userBaseURL)
driver.Navigate().GoToUrl(string.Format("{0}/{1}", baseURL, URL));
else
driver.Navigate().GoToUrl(URL);
}
}
最新更新:根据建议,我删除了静态引用,但有人可以帮助我了解在当前代码中创建驱动程序实例的语法
public class Pages
{
private T GetPage<T>() where T : new()
{
var page = new T();
PageFactory.InitElements(Browser.Driver, page);
return page;
}
public LoginPage Login
{
get { return GetPage<LoginPage>(); }
}
public RegisterPage Register
{ get { return GetPage<RegisterPage>(); } }
public SearchPage Search
{ get { return GetPage<SearchPage>(); } }
}
我不知道如何创建 Browser.Driver 的实例,请帮忙!
删除 class 中对 "static" 的所有引用,并在每个测试中创建 class 的实例以解决您的问题。
...现在更改您的页面 class 以在构造函数中接受驱动程序
public class Pages
{
private readonly ISearchContext _context;
public Pages(ISearchContext context)
{
_context = context;
}
private T GetPage<T>() where T : new()
{
var page = new T();
PageFactory.InitElements(_context, page);
return page;
}
public LoginPage Login
{
get { return GetPage<LoginPage>(); }
}
public RegisterPage Register
{ get { return GetPage<RegisterPage>(); } }
public SearchPage Search
{ get { return GetPage<SearchPage>(); } }
}
...然后在你的测试方法中
var browser = new Browser();
var page = new Page(browser.Driver);
对不起。离开并注意到你的更新。
我有一个单独的 class 助手,用于 return 我的网络驱动程序。我正在使用 chrome 驱动程序和(无头)单元驱动程序,在我的机器上,它的策略需要几个参数才能得到它 运行,所以 class 本身对我来说很有意义。例如。 WebDriverHelper.java。这有几个静态方法,return 是感兴趣的驱动程序的新实例。
例如
WebDriver myDriver = WebDriverHelper.ChromeDriver();
我的 ChromeDriver 方法return是一个新的驱动程序。
例如
return new ChromeDriver;
如果您需要更多详细信息,请告诉我,我会在明天上班时复制一些 classes。
更新请见底部!
我正在设置我的框架,目前有 4 个测试。就个人而言,他们都 运行 喜欢魅力。但是,当我尝试 运行 所有 4 个并行时 (我已经正确设置了 Parallelizable 属性,并且正在从不在同一方法中的不同 classes 调用测试) 我一直收到几个错误,这些错误似乎在每次测试中都会出现。这些是我收到的每个消息 运行:
再次 运行 单独测试时会发现这些对象。我不确定我需要显示什么代码才能提供帮助。请指教
更新** @Chris 我的怀疑是一样的。我认为我的测试在查找对象时混淆了同一个驱动程序。如果是这种情况,有人可以建议如何更好地处理这个问题,我的浏览器 class 正在调用驱动程序。
public static class Browser
{
private static IWebDriver driver;
private static string baseURL = "someURL";
public static ISearchContext Driver { get { return driver; } }
internal static bool WaitUntilElementIsDisplayed(By element, int timeout)
{
for (int i = 0; i < timeout; i++)
{
if (ElementIsDisplayed(element))
{
return true;
}
Thread.Sleep(1000);
}
return false;
}
internal static IWebElement FindElement(By by)
{
return driver.FindElement(by);
}
public static bool ElementIsDisplayed(By element)
{
var present = false;
driver.Manage().Timeouts().ImplicitlyWait(System.TimeSpan.FromSeconds(0));
try
{
present = driver.FindElement(element).Displayed;
}
catch (NoSuchElementException)
{ }
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
return present;
}
public static void Initialize()
{
var options = new InternetExplorerOptions();
options.IntroduceInstabilityByIgnoringProtectedModeSettings = true;
options.EnsureCleanSession = true;
options.IgnoreZoomLevel = true;
driver =
new InternetExplorerDriver(
@"C:Myfilepath",
options, TimeSpan.FromMinutes(10));
Goto("");
}
public static void CleanUp()
{
driver.Close();
driver.Quit();
}
public static void Goto(string URL, bool userBaseURL = true)
{
if (userBaseURL)
driver.Navigate().GoToUrl(string.Format("{0}/{1}", baseURL, URL));
else
driver.Navigate().GoToUrl(URL);
}
}
最新更新:根据建议,我删除了静态引用,但有人可以帮助我了解在当前代码中创建驱动程序实例的语法
public class Pages
{
private T GetPage<T>() where T : new()
{
var page = new T();
PageFactory.InitElements(Browser.Driver, page);
return page;
}
public LoginPage Login
{
get { return GetPage<LoginPage>(); }
}
public RegisterPage Register
{ get { return GetPage<RegisterPage>(); } }
public SearchPage Search
{ get { return GetPage<SearchPage>(); } }
}
我不知道如何创建 Browser.Driver 的实例,请帮忙!
删除 class 中对 "static" 的所有引用,并在每个测试中创建 class 的实例以解决您的问题。
...现在更改您的页面 class 以在构造函数中接受驱动程序
public class Pages
{
private readonly ISearchContext _context;
public Pages(ISearchContext context)
{
_context = context;
}
private T GetPage<T>() where T : new()
{
var page = new T();
PageFactory.InitElements(_context, page);
return page;
}
public LoginPage Login
{
get { return GetPage<LoginPage>(); }
}
public RegisterPage Register
{ get { return GetPage<RegisterPage>(); } }
public SearchPage Search
{ get { return GetPage<SearchPage>(); } }
}
...然后在你的测试方法中
var browser = new Browser();
var page = new Page(browser.Driver);
对不起。离开并注意到你的更新。
我有一个单独的 class 助手,用于 return 我的网络驱动程序。我正在使用 chrome 驱动程序和(无头)单元驱动程序,在我的机器上,它的策略需要几个参数才能得到它 运行,所以 class 本身对我来说很有意义。例如。 WebDriverHelper.java。这有几个静态方法,return 是感兴趣的驱动程序的新实例。
例如
WebDriver myDriver = WebDriverHelper.ChromeDriver();
我的 ChromeDriver 方法return是一个新的驱动程序。
例如
return new ChromeDriver;
如果您需要更多详细信息,请告诉我,我会在明天上班时复制一些 classes。