Как предотвратить сбои при параллельном запуске тестов и переключении фреймов? - PullRequest
0 голосов
/ 27 марта 2019

В настоящее время я занимаюсь решением тестов с использованием селена и спецпроцесса, и я плавно выполнял все параллельно, разделяя один веб-драйвер между окнами браузера (chrome).

Но теперь мне пришлось добавить пару сценариев, включающих переключение между кадрами, и тесты начали случайным образом прерываться при параллельной работе из-за отсутствия элементов или фреймов.

Кто-нибудь имел эту проблему и знает хороший способ решить эту проблему?

Редактировать: некоторый код Это класс, который я использую для настройки моего теста

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);
        }

Затем в файле шага я инициализирую веб-драйвер в конструкторе

 private readonly IWebDriver driver;

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

1 Ответ

0 голосов
/ 28 марта 2019

@ Dayan54 - Пожалуйста, посмотрите на ниже. Я запускаю 4-6 потоков в SpecFlow, и у меня есть iFrames без проблем. Может быть, это поможет.

Также я видел это, поэтому я должен спросить. в некоторых iFrames, например, для входа в социальные сети для 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;
        }
    }
...