Сумерки Laravel со стеком браузера для запуска тестов на нескольких устройствах и в разных браузерах

Я использую этот пакет (browserstack/browserstack-local: ^1.1) для запуска тестов в сумерках на BrowserStack. Теперь требуется запустить тесты на нескольких и разных устройствах с разными браузерами. В настоящее время я использую этот подход для запуска тестов.

private function browserStackCaps($local_identifier)
{
    return [
        'project' => config('app.name'),
        'browserstack.local' => 'true',
        'browser' => env('BROWSER'),
        'device' => env('DEVICE'),
        'acceptSslCert' => true,
        'resolution' => '1920x1080'
    ];
}

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


person Hassan Hafeez    schedule 22.10.2020    source источник


Ответы (2)


вы можете реализовать это на своем конце. Получите список браузеров и устройств, на которых вы хотите выполнить свои тесты с использованием REST API, и используйте его.

REST API, который будет использоваться:

curl -u имя пользователя: пароль
https://api.browserstack.com/automate/browsers.json

Подробнее об этом читайте здесь: https://www.browserstack.com/docs/automate/api-reference/selenium/browser#get-browser-list

person HN17    schedule 22.10.2020
comment
Извините, если я не могу правильно объяснить свой вопрос. У меня уже есть список браузеров и устройств, на которых я хочу выполнять тесты. Но я не знаю, как использовать этот список в качестве источника для #dusk. - person Hassan Hafeez; 22.10.2020
comment
Я хочу запустить один и тот же тест на разных устройствах, и для этого мне нужно запускать команду одну за другой после изменения имени браузера или ОС в массиве заглавных букв, но теперь мне нужен способ дать более одной комбинации браузеров и устройств в виде массива так что мне не пришлось бы бегать по одному. - person Hassan Hafeez; 22.10.2020

Я знаю, что это старо, но я нашел эту страницу в поисках решения. Я закончил тем, что сам построил один, который, вероятно, соответствовал бы вашему варианту использования. Самым большим препятствием, с которым я столкнулся, было $this->browse() в обычном тесте Dusk: использовался один экземпляр Laravel\Dusk\Browser, а новые возможности не применялись. Эта реализация добавляет функцию с именем performTest в файл DuskTestCase.php. Эта функция перебирает набор возможностей и создает новый экземпляр Laravel\Dusk\Browser для каждого теста. Эта функция работает аналогично существующей функции browse в Laravel Dusk. Вы вызываете performTest, передавая ему вызываемый объект, который принимает один параметр, который является экземпляром Laravel\Dusk\Browser.

Тестовый пример в сумерках

<?php

namespace Tests;

use Laravel\Dusk\TestCase as BaseTestCase;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;

abstract class DuskTestCase extends BaseTestCase
{
    use CreatesApplication;
    protected array $capabilities;

    private const BROWSERS = [
        'ios_14_iphone_xs_safari' => [
            "os_version" => "14",
            "device" => "iPhone XS",
            "real_mobile" => "true",
            "browserstack.local" => "true",
            'acceptSslCerts' => 'true'                
        ],
        'mac_osx_catalina_safari' => [
            "os" => "OS X",
            "os_version" => "Catalina",
            "browser" => "Safari",
            "browser_version" => "13.0",
            "browserstack.local" => "true",
            "browserstack.selenium_version" => "3.14.0",
            "resolution" => "1920x1080",
            'acceptSslCerts' => 'true',
        ]
    ];



    /**
     * Create the RemoteWebDriver instance.
     *
     * @return \Facebook\WebDriver\Remote\RemoteWebDriver
     */
    protected function driver()
    {
        $browserStackConnectionUrl = config('browserstack.connection_url');
        return RemoteWebDriver::create(
            $browserStackConnectionUrl, $this->capabilities
        );
    }

    protected function performTest(Callable $test){
        foreach(self::BROWSERS as $browserName => $capabilitySet){
            try {
                $this->capabilities = $capabilitySet;
                $browser = $this->newBrowser($this->driver());
                $test($browser);
                $browser->quit();
                fprintf(STDOUT, "\e[0;32m√ {$browserName}\r\n");
            }
            catch(\Exception $exception){
                fprintf(STDOUT, "\e[0;31mX {$browserName}\r\n");
                throw $exception;
            }
        }
    }


}

Пример теста

<?php

namespace Tests\Browser;

use Tests\DuskTestCase;
use Laravel\Dusk\Browser;

class ExampleTest extends DuskTestCase
{
    public function testExample()
    {
        $this->performTest(function(Browser $browser){
            $browser->visit('/')
                ->assertDontSee('Foobar');
        });
    }
}

config/browserstack.php

<?php

return [
    'connection_url' => env('BROWSERSTACK_CONNECTION_URL')
];
person Chris Ruskai    schedule 24.06.2021