Laravel dusk with browserstack to 运行 在多个设备和浏览器上进行测试
Laravel dusk with browserstack to run tests on multiple devices and browsers
我正在使用这个 ("browserstack/browserstack-local": "^1.1") 包在 BrowserStack 上进行 运行 dusk 测试。现在的要求是 运行 在具有不同浏览器的多个不同设备上进行测试。目前,我正在按照这种方法进行 运行 测试。
private function browserStackCaps($local_identifier)
{
return [
'project' => config('app.name'),
'browserstack.local' => 'true',
'browser' => env('BROWSER'),
'device' => env('DEVICE'),
'acceptSslCert' => true,
'resolution' => '1920x1080'
];
}
这种方法的缺点是每次我需要在不同的 device/browser 上进行 运行 测试时,我都必须更改 .env 文件中的设备名称和浏览器名称。有什么方法可以 运行 在提供的数组上进行测试吗?包含设备和浏览器信息的数组。
你可以在你这边实现这个。获取要使用 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
我知道这是旧的,但我在寻找解决方案时找到了这个页面。我最终自己构建了一个可能会满足您的 use-case。我遇到的最大障碍是 $this->browse()
在正常 Dusk 测试中使用 Laravel\Dusk\Browser
的单个实例并且没有引入新功能。此实现添加了一个名为 performTest
到 DuskTestCase.php 文件。此函数循环遍历一组功能并为每个测试实例化 Laravel\Dusk\Browser
的新实例。此函数的工作方式类似于 Laravel Dusk 中现有的 browse
函数。您通过向 performTest
传递一个接受单个参数的可调用对象来调用 performTest
,该参数是 Laravel\Dusk\Browser
的一个实例
Dusk 测试用例
<?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')
];
我正在使用这个 ("browserstack/browserstack-local": "^1.1") 包在 BrowserStack 上进行 运行 dusk 测试。现在的要求是 运行 在具有不同浏览器的多个不同设备上进行测试。目前,我正在按照这种方法进行 运行 测试。
private function browserStackCaps($local_identifier)
{
return [
'project' => config('app.name'),
'browserstack.local' => 'true',
'browser' => env('BROWSER'),
'device' => env('DEVICE'),
'acceptSslCert' => true,
'resolution' => '1920x1080'
];
}
这种方法的缺点是每次我需要在不同的 device/browser 上进行 运行 测试时,我都必须更改 .env 文件中的设备名称和浏览器名称。有什么方法可以 运行 在提供的数组上进行测试吗?包含设备和浏览器信息的数组。
你可以在你这边实现这个。获取要使用 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
我知道这是旧的,但我在寻找解决方案时找到了这个页面。我最终自己构建了一个可能会满足您的 use-case。我遇到的最大障碍是 $this->browse()
在正常 Dusk 测试中使用 Laravel\Dusk\Browser
的单个实例并且没有引入新功能。此实现添加了一个名为 performTest
到 DuskTestCase.php 文件。此函数循环遍历一组功能并为每个测试实例化 Laravel\Dusk\Browser
的新实例。此函数的工作方式类似于 Laravel Dusk 中现有的 browse
函数。您通过向 performTest
传递一个接受单个参数的可调用对象来调用 performTest
,该参数是 Laravel\Dusk\Browser
Dusk 测试用例
<?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')
];