-2

请在底部查看更新!

我正在设置我的框架,目前有 4 个测试。单独他们都像魅力一样运行。但是,当我尝试并行运行所有 4 个时(我已经正确设置了 Parallelizable 属性,并且正在从不同的类而不是在同一个方法中调用测试),我一直得到几个似乎在每个测试中跳跃的错误。这些是我每次运行时收到的消息:在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

再次单独运行测试时会找到这些对象。我不确定我需要显示什么代码才能提供帮助。请指教。

更新** @Chris 我的怀疑是一样的。我认为我的测试在寻找对象时会混淆同一个驱动程序。如果是这种情况,有人可以建议如何更好地处理这个问题,我的浏览器类就是调用驱动程序的东西。

 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 的实例请帮助!

4

2 回答 2

0

对不起。离开并注意到您的更新。

我有一个单独的类助手,用于返回我的网络驱动程序。我正在使用 chrome 驱动程序和(无头)单元驱动程序,在我的机器上,它需要几个参数才能运行,所以一个类本身对我来说很有意义。例如 WebDriverHelper.java。这有几个静态方法返回感兴趣的驱动程序的新实例。

例如

WebDriver myDriver = WebDriverHelper.ChromeDriver();

我的 ChromeDriver 方法返回一个新的驱动程序。

例如

return new ChromeDriver;

如果您需要更多详细信息,请告诉我,我会在明天上班时复制我的一些课程。

于 2017-09-26T19:25:55.320 回答
0

删除类中对“静态”的所有引用,并在每个测试中创建该类的实例以解决您的问题。

...现在更改您的 Page 类以接受构造函数中的驱动程序

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);
于 2017-09-26T17:10:02.767 回答