Запуск селен против нескольких браузеров с MSTEST - PullRequest
5 голосов
/ 05 сентября 2011

Я использую селен и использую mstest для управления им.Моя проблема в том, что я хочу, чтобы весь мой пакет работал с 3 разными браузерами (IE, Firefox и chrome).

Что я не могу понять, так это как тестирование данных на уровне набора или повторный запускпакет с различными параметрами.

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

Так кто-нибудь знает, как я могу инициализировать сборку данных?или если есть другое решение.

Ответы [ 3 ]

0 голосов
/ 10 октября 2014

Для этого мы написали оболочку для веб-драйвера и используем оператор switch на основе свойства для выбора типа браузера.

Вот фрагментИспользуя DesiredCapabilities, вы можете указать grid для каких браузеров выполнять.

switch (Controller.Instance.Browser)
            {
                case BrowserType.Explorer:
                    var capabilities = DesiredCapabilities.InternetExplorer();
                    capabilities.SetCapability("ignoreProtectedModeSettings", true);
                    Driver = new ScreenShotRemoteWebDriver(new Uri(uri), capabilities, _commandTimeout);
                    break;
                case BrowserType.Chrome:
                    Driver = new ScreenShotRemoteWebDriver(new Uri(uri), DesiredCapabilities.Chrome(), _commandTimeout);
                    break;
            }
0 голосов
/ 04 июля 2019

Эта идея лучше подходит для автоматизированного сценария CI, чем для интерактивного интерфейса, но вы можете использовать файл runsettings и объявить параметр в этом:

<?xml version='1.0' encoding='utf-8'?>
<RunSettings>
    <TestRunParameters>
        <Parameter name="SELENIUM_BROWSER" value="Firefox" />
    </TestRunParameters>
</RunSettings>

Вам понадобится TestContext для вашего класса Test

public TestContext TestContext { get; set; }

Затем в вашем MSTest при инициализации драйвера вы можете проверить, какой браузер вы хотите запустить

switch (TestContext.Properties["SELENIUM_BROWSER"]?.ToString())
{
    case BrowserType.Chrome:
        return new ChromeDriver();
    case BrowserType.Edge:
        return new EdgeDriver();
    case BrowserType.Firefox:
        return new FirefoxDriver();
}

Затем вы выполняете набор тестов n раз, по одному разу для каждого файла настроек выполнения

0 голосов
/ 03 января 2014

Это то, что я сделал. Преимущество этого подхода заключается в том, что он будет работать для любой тестовой среды (mstest, nunit и т. Д.), И сами тесты не должны интересоваться или знать что-либо о браузерах. Вам просто нужно убедиться, что имя метода встречается в иерархии наследования только один раз. Я использовал этот подход для сотен тестов, и он работает для меня.

  1. Все тесты наследуются от базового класса тестов (например, BaseTest).
  2. BaseTest хранит все объекты драйвера (IE, FireFox, Chrome) в массиве (multiDriverList в моем примере ниже).
  3. В BaseTest есть следующие методы:

    public void RunBrowserTest( [CallerMemberName] string methodName = null )
    {              
        foreach( IDriverWrapper driverWrapper in multiDriverList ) //list of browser drivers - Firefox, Chrome, etc. You will need to implement this.
        {
            var testMethods = GetAllPrivateMethods( this.GetType() );
            MethodInfo dynMethod = testMethods.Where(
                    tm => ( FormatReflectionName( tm.Name ) == methodName ) &&
                      ( FormatReflectionName( tm.DeclaringType.Name ) == declaringType ) &&
                      ( tm.GetParameters().Where( pm => pm.GetType() == typeof( IWebDriver ) ) != null ) ).Single();
            //runs the private method that has the same name, but taking a single IWebDriver argument
            dynMethod.Invoke( this, new object[] { driverWrapper.WebDriver } ); 
        }
    } 
    
    //helper method to get all private methods in hierarchy, used in above method
    private MethodInfo[] GetAllPrivateMethods( Type t )
    {
        var testMethods = t.GetMethods( BindingFlags.NonPublic | BindingFlags.Instance );
        if( t.BaseType != null )
        {
            var baseTestMethods = GetAllPrivateMethods( t.BaseType );
            testMethods = testMethods.Concat( baseTestMethods ).ToArray();
        }
        return testMethods;
    }
    
    //Remove formatting from Generic methods
    string FormatReflectionName( string nameIn )
    {            
        return Regex.Replace( nameIn, "(`.+)", match => "" );
    }
    
  4. Использовать следующим образом:

    [TestMethod]
    public void RunSomeKindOfTest()
    {
        RunBrowserTest(); //calls method in step 3 above in the base class
    }
    private void RunSomeKindOfTest( IWebDriver driver )
    {
        //The test. This will be called for each browser passing in the appropriate driver in each case
        ...            
    }     
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...