在并行运行测试并切换iframe时,如何防止测试失败?

时间:2019-03-27 11:21:59

标签: c# selenium testing webdriver specflow

我目前正在维护使用硒和specflow进行测试的解决方案,并且我正在顺畅地并行运行所有内容,并在浏览器(chrome)窗口之间共享了一个单独的webdriver。

但是现在我不得不添加一些涉及在帧之间进行切换的场景,并且由于找不到元素或iframe,因此并行运行时测试开始随机中断。

有人遇到过这个问题,知道解决这个问题的好方法吗?

编辑:一些代码 这是我用来设置测试运行的班级中的

private readonly IObjectContainer objectContainer;
        private ChromeWebDriver chromeWebDriver;

        public TestSetup(IObjectContainer container)
        {
            this.objectContainer = container;
        }

        [BeforeScenario]
        public void SetUp()
        {
            chromeWebDriver = new ChromeWebDriver();
            objectContainer.RegisterInstanceAs<ChromeWebDriver>(chromeWebDriver);
        }

然后在步骤文件中,我将在构造函数中初始化Webdriver

 private readonly IWebDriver driver;

public LoginSteps(ChromeWebDriver chromeWebDriver)
        {
            this.driver = chromeWebDriver.WebDriver;
        }

1 个答案:

答案 0 :(得分:0)

@ Dayan54-请查看以下内容。我在SpecFlow中运行4-6个线程,并且iFrames没有问题。也许这会有所帮助。

我也看到了这一点,所以我不得不问。在某些iFrame中,例如说FaceBook或InstaGram的社交媒体登录,当您登录时,它会自动关闭iFrame。然后,这将对您执行的其他任何操作产生错误,因为如果尝试将其关闭,则会收到错误消息,因为该错误已被关闭。切换到主要内容将失败,因为您已经在那里。为此,我编写了“ GoToMainHandle”方法。

 //switch to the iframe name -

 public static void SwitchToIframe(string frameName)
    {
        try
        {
            Driver.SwitchTo().Frame(frameName);
        }
        catch (NoSuchFrameException)
        {
            try
            {
                Driver.SwitchTo().Frame(frameName);
            }
            catch (NoSuchFrameException)
            {
                Console.WriteLine("Could not switch to IFrame");
                throw;
            }
        }
    }


   //going back to main content when completed with iframe 


    public static void SwitchToMainContent()
    {
        Driver.SwitchTo().DefaultContent();
    }



   //If the iframe closes automatically, you still need to get back to the main window

         public static void GoToMainHandle()
    {
        var handles = Driver.WindowHandles;
        foreach (var handle in handles)
        {
            Driver.SwitchTo().Window(handle);
            break;
        }
    }