브라우저 테스트 황혼
ㅋㅋ
브라우저 테스트(Laravel Dusk)
소개
Laravel Dusk는 표현력이 풍부하고 사용하기 쉬운 브라우저 자동화 및 테스트 API를 제공합니다. 기본적으로 Dusk에서는 컴퓨터에 JDK 또는 Selenium을 설치할 필요가 없습니다. 대신 별도의 ChromeDriver를 사용하여 설치해야 합니다. 물론 다른 Selenium 호환 드라이버를 자유롭게 사용할 수도 있습니다.
설치
먼저 Composer 종속성에 laravel/dusk
를 추가해야 합니다. laravel/dusk
依赖 :
composer require --dev laravel/dusk
{note} 如果你是手动注册 Dusk 服务提供者,一定 不能 在你的生产环境中注册,这样可能会导致一些不守规矩的用户拥有控制你应用的权限。
安装好 Dusk 包后,运行 dusk:install
命令:
php artisan dusk:install
Browser
目录将会在 tests
目录下被创建,并且包含一个测试用例。接下来,在你的 .env
文件中设置 APP_URL
变量。这个值应该与你在浏览器中打开本应用的 URL 匹配。
要运行测试,使用 dusk
命令。 dusk
命令可以使用与 phpunit
命令同样的参数:
php artisan dusk
如果上次运行 dusk
命令时测试失败,则可以通过使用 dusk:fails
命令重新运行失败的测试来节省时间:
php artisan dusk:fails
{注意} Dusk 要求 ChromeDriver 二进制文件是可执行的。如果在 Dusk 运行时遇到问题,可以使用以下命令确保二进制文件是可执行的:
chmod -R 0755 vendor/laravel/dusk/bin
。
使用其他浏览器
默认情况下, Dusk 使用 Google Chrome 浏览器和一个单独的 ChromeDriver 的安装来运行你的浏览器测试。当然,你可以运行你自己的 Selenium 服务,用任何你想用的浏览器来进行测试。
如果要这么做,打开 tests/DuskTestCase.php
文件,这个是应用测试用例的基类。在这个文件中,你可以移除对 startChromeDriver
方法的调用。这样 Dusk 就不会自动启动 ChromeDriver 了。
/** * 准备执行 Dusk 测试。 * * @beforeClass * @return void */ public static function prepare(){ // static::startChromeDriver(); }
然后,你可以修改 driver
方法来连接到你选定的 URL 和端口。此外,你可以修改 「desired capabilities」(期望能力),它将会被传递给 WebDriver:
/** * 创建 RemoteWebDriver 实例。 * * @return \Facebook\WebDriver\Remote\RemoteWebDriver */ protected function driver(){ return RemoteWebDriver::create( 'http://localhost:4444/wd/hub', DesiredCapabilities::phantomjs() ); }
开始使用
创建测试
要创建一个 Dusk 测试,使用 dusk:make
命令。创建的测试将会被放在 tests/Browser
php artisan dusk:make LoginTest
{note} Dusk 서비스 공급자를 수동으로 등록하는 경우에는 하지 말아야 합니다 Strong> 프로덕션 환경에 등록하면 통제하기 어려운 일부 사용자가 애플리케이션을 제어할 수 있습니다.Dusk 패키지를 설치한 후
dusk:install
명령을 실행하세요. php artisan dusk
Browser
디렉터리는 tests
디렉토리가 생성되고 테스트 케이스가 포함됩니다. 다음으로 .env
파일에서 APP_URL
변수를 설정하세요. 이 값은 브라우저에서 앱을 여는 URL과 일치해야 합니다. 테스트를 실행하려면 dusk
명령을 사용하세요. dusk
명령은 phpunit
명령과 동일한 매개변수를 사용할 수 있습니다: 🎜php artisan dusk:fails🎜마지막으로
dusk
명령을 실행했을 때 테스트가 실패한 경우, < code>dusk:fails 명령을 사용하면 실패한 테스트를 다시 실행하여 시간을 절약할 수 있습니다. 🎜php artisan dusk --group=foo
🎜{Note} Dusk 요구 사항 ChromeDriver🎜 바이너리는 실행 가능합니다. Dusk가 실행 중일 때 문제가 발생하면 다음 명령을 사용하여 바이너리가 실행 가능한지 확인할 수 있습니다: chmod -R 0755 Vendor/laravel/dusk/bin
. 🎜
🎜🎜🎜다른 브라우저 사용
🎜아래 기본값은, Dusk는 Google Chrome과 별도의 ChromeDriver🎜 설치를 사용하여 브라우저 테스트를 실행합니다. 물론 자신만의 Selenium 서비스를 실행하고 원하는 브라우저를 사용하여 테스트할 수 있습니다. 🎜🎜이 작업을 수행하려면tests/DuskTestCase.php
파일을 엽니다. 이는 애플리케이션 테스트 케이스의 기본 클래스입니다. 이 파일에서 startChromeDriver
메서드에 대한 호출을 제거할 수 있습니다. 이렇게 하면 Dusk가 ChromeDriver를 자동으로 시작하지 않습니다. 🎜/** * 为 Dusk 测试做准备。 * * @beforeClass * @return void */ public static function prepare(){ // static::startChromeDriver(); }🎜그런 다음
driver
메서드를 수정하여 원하는 URL과 포트에 연결할 수 있습니다. 또한 WebDriver에 전달될 "원하는 기능"(원하는 기능)을 수정할 수 있습니다: 🎜/** * 创建 RemoteWebDriver 实例。 * * @return \Facebook\WebDriver\Remote\RemoteWebDriver */ protected function driver(){ return RemoteWebDriver::create( 'http://localhost:9515', DesiredCapabilities::chrome() ); }🎜🎜🎜
테스트 만들기
🎜 Dusk 테스트하려면dusk:make
명령을 사용하세요. 생성된 테스트는 tests/Browser
디렉토리에 배치됩니다: 🎜<?php namespace Tests\Browser; use App\User;use Tests\DuskTestCase; use Laravel\Dusk\Chrome; use Illuminate\Foundation\Testing\DatabaseMigrations; class ExampleTest extends DuskTestCase{ use DatabaseMigrations; /** * 一个基本的浏览器测试例子。 * * @return void */ public function testBasicExample() { $user = factory(User::class)->create([ 'email' => 'taylor@laravel.com', ]); $this->browse(function ($browser) use ($user) { $browser->visit('/login') ->type('email', $user->email) ->type('password', 'secret') ->press('Login') ->assertPathIs('/home'); }); } }🎜🎜🎜🎜🎜🎜
테스트 실행
dusk
명령을 사용하여 브라우저 테스트를 실행하세요. dusk
命令来运行你的浏览器测试:
$this->browse(function ($first, $second) { $first->loginAs(User::find(1)) ->visit('/home') ->waitForText('Message'); $second->loginAs(User::find(2)) ->visit('/home') ->waitForText('Message') ->type('message', 'Hey Taylor') ->press('Send'); $first->waitForText('Hey Taylor') ->assertSee('Jeffrey Way'); });
如果上次运行 dusk
命令时测试失败,则可以通过使用 dusk:fails
命令重新运行失败的测试来节省时间:
$browser->resize(1920, 1080);
dusk
命令接受任何能让 PHPUnit 正常运行的参数。例如,让你可以在指定 group 中运行测试:
$browser->maximize();
手动运行 ChromeDriver
默认情况下,Dusk 会尝试自动运行 ChromeDriver。如果你在特定的系统中不能运行,可以在运行 dusk
命令前通过手动的方式来运行 ChromeDriver。 如果你选择手动运行 ChromeDriver,你需要在你的 tests/DuskTestCase.php
文件中注释掉下面这一行:
<?php namespace App\Providers; use Laravel\Dusk\Browser; use Illuminate\Support\ServiceProvider; class DuskServiceProvider extends ServiceProvider{ /** * 注册Dusk的浏览器宏 * * @return void */ public function boot() { Browser::macro('scrollToElement', function ($element = null) { $this->script("$('html, body').animate({ scrollTop: $('$element').offset().top }, 0);"); return $this; }); } }
另外,如果你的 ChromeDriver 运行在非 9515 端口 ,你需要修改同一个类中的 driver
方法:
$this->browse(function ($browser) use ($user) { $browser->visit('/pay') ->scrollToElement('#credit-card-details') ->assertSee('Enter Credit Card Details'); });
环境处理
为了让 Dusk 使用自己的环境文件来运行测试,你需要在项目根目录创建一个 .env.dusk.{environment}
文件。简单的说,如果你想用 local
环境来运行 dusk
命令,你需要创建一个 .env.dusk.local
文件。
运行测试的时候,Dusk 会备份你的 .env
文件并且重命名你的 Dusk 环境文件为 .env
。当测试结束后,它会恢复你的 .env
文件。
创建浏览器
让我们先来写一个测试用例,这个例子可以验证我们是否能够登录系统。生成测试例子之后,我们可以修改它并让它可以跳转到登录界面,输入登录信息之后,点击「登录」按钮。我们通过 browse
方法来创建一个浏览器实例:
$this->browse(function ($first, $second) { $first->loginAs(User::find(1)) ->visit('/home'); });
在上面的例子中,browse
方法接收了一个回调参数。Dusk 会自动将这个浏览器实例注入到回调过程中,而且这个浏览器实例可以和你的应用进行交互和断言。
{tip} 这个测试例子可以用来测试
make:auth
命令生成的登录界面。
创建多个浏览器
有时候你可能需要多个浏览器才能正确的进行测试。例如,使用多个浏览器测试通过 websockets 进行通讯的在线聊天页面。想要创建多个浏览器,需要在 browse
<?php namespace Tests\Browser; use App\User; use Tests\DuskTestCase; use Laravel\Dusk\Chrome; use Illuminate\Foundation\Testing\DatabaseMigrations; class ExampleTest extends DuskTestCase{ use DatabaseMigrations; }마지막으로
dusk
명령을 실행했을 때 테스트가 실패한 경우 다음 방법으로 실행할 수 있습니다. 를 사용하면 dark:fails
명령은 실패한 테스트를 다시 실행하여 시간을 절약합니다. // HTML... <button>Login</button> // Test... $browser->click('.login-page .container div > button');
dusk
명령은 PHPUnit이 제대로 실행되도록 하는 모든 매개 변수를 허용합니다. 예를 들어 지정된 그룹에서 테스트를 실행하도록 허용합니다. 🎜 // HTML... <button dusk="login-button">Login</button> // Test... $browser->click('@login-button');
ChromeDriver를 수동으로 실행
🎜기본적으로 Dusk는 ChromeDriver를 자동으로 실행하려고 시도합니다. 특정 시스템에서 작동하지 않으면dusk
명령을 실행하기 전에 ChromeDriver를 수동으로 실행할 수 있습니다. ChromeDriver를 수동으로 실행하기로 선택한 경우 tests/DuskTestCase.php
파일에서 다음 줄을 주석 처리해야 합니다. 🎜$browser->clickLink($linkText);🎜또한 ChromeDriver가 9515가 아닌 포트에서 실행되는 경우 동일한 클래스의
driver
메소드를 수정해야 합니다: 🎜// 检索值... $value = $browser->value('selector'); // 设置值... $browser->value('selector', 'value');🎜🎜
.env.dusk.{environment}
파일을 생성해야 합니다. 간단히 말해서 local
환경을 사용하여 dusk
명령을 실행하려면 .env.dusk.local
파일을 생성해야 합니다. . 🎜🎜테스트를 실행할 때 Dusk는 .env
파일을 백업하고 Dusk 환경 파일의 이름을 .env
로 바꿉니다. 테스트가 완료되면 .env
파일이 복원됩니다. 🎜🎜🎜browse
메소드를 통해 브라우저 인스턴스를 생성합니다. 🎜$text = $browser->text('selector');🎜위 예에서
browse
메소드는 콜백 매개변수를 받습니다. Dusk는 이 브라우저 인스턴스를 콜백 프로세스에 자동으로 주입하며, 이 브라우저 인스턴스는 애플리케이션과 상호 작용하고 어설션할 수 있습니다. 🎜🎜{tip} 이 테스트 예제는 make:auth
명령으로 생성된 로그인 인터페이스를 테스트하는 데 사용할 수 있습니다. 🎜
여러 브라우저 만들기
🎜때로는 올바르게 테스트하기 위해 여러 브라우저가 필요할 수 있습니다. 예를 들어 여러 브라우저를 사용하여 웹소켓을 통해 통신하는 온라인 채팅 페이지를 테스트합니다. 여러 브라우저를 생성하려면 이름을 사용하여browse
메서드의 콜백에서 브라우저 인스턴스를 구별한 다음 이를 콜백에 전달하여 여러 브라우저 인스턴스에 대해 "적용"해야 합니다. 🎜$attribute = $browser->attribute('selector', 'value');🎜🎜
브라우저 창 크기 변경
resize
메서드를 사용하여 브라우저 창 크기를 조정할 수 있습니다: resize
方法去调整浏览器的窗口大小:
$browser->type('email', 'taylor@laravel.com');
maximize
方法可以将浏览器窗口最大化:
$browser->type('tags', 'foo') ->append('tags', ', bar, baz');
浏览器宏
如果你想定义一个可以在各种测试中重复使用的自定义浏览器方法,可以在 Browser
类中使用 macro
方法。通常,你应该从 服务提供者 的 boot
方法中调用它:
$browser->clear('email');
macro
方法接收一个名称作为第一个参数,第二个参数则是一个闭包。 当调用浏览器宏作为一个 Browser
的实现的方法时,浏览器宏的闭包将会执行:
$browser->select('size', 'Large');
认证
你可能经常会测试一些需要认证的页面。你可以使用 Dusk 的 loginAs
方法来避免每个测试都去登陆页面登陆一次。 loginAs
可以使用用户 ID 或者用户模型实例:
$browser->select('size');
{note} 使用
loginAs
方法后,该用户的 session 将会持久化的供其他测试用例使用。
数据库迁移
就像上面的认证例子一样,当你的测试用例需要迁移的时候,你不应该使用 RefreshDatabase
trait。 RefreshDatabase
trait 使用了不适用于 HTTP 请求的数据库事务。取而代之,我们要用 DatabaseMigrations
trait:
$browser->check('terms');$browser->uncheck('terms');
与元素交互
Dusk 选择器
选择一个好的 CSS 选择器用于元素交互是编写 Dush 测试最困难的部分之一。随着时间推移,前端的更改可能会导致类似以下的 CSS 选择器中断测试:
$browser->radio('version', 'php7');
Dusk 选择器让你专注于编写有效的测试,而不是去记忆 CSS 选择器。要定义一个选择器,只需在你的 HTML 元素中添加一个 dusk
属性。然后,在选择器前面添加 @
去操作 Dusk 测试中的附加元素:
$browser->attach('photo', __DIR__.'/photos/me.png');
点击链接
要点击链接的话,你可以在浏览器实例上使用 clickLink
方法。clickLink
$browser->keys('selector', ['{shift}', 'taylor'], 'otwell');
maximize
메서드는 브라우저 창을 최대화할 수 있습니다: $browser->keys('.app', ['{command}', 'j']);
브라우저 매크로
하나를 정의하고 싶다면 다양한 용도로 사용할 수 있습니다. 테스트 사용자 정의 브라우저 메소드를 재사용하려면Browser
클래스의 macro
메소드를 사용할 수 있습니다. 일반적으로 서비스 제공자의 boot
메소드에서 호출해야 합니다. $browser->click('.selector');
macro
메소드는 첫 번째 매개변수로 이름을 받고 두 번째 매개변수인 Closure를 받습니다. 브라우저 매크로가 브라우저
구현의 메서드로 호출되면 브라우저 매크로의 폐쇄가 실행됩니다: $browser->mouseover('.selector');
인증
🎜인증이 필요한 일부 페이지를 자주 테스트할 수도 있습니다. Dusk의loginAs
메소드를 사용하면 각 테스트마다 로그인 페이지에 로그인할 필요가 없습니다. loginAs
는 사용자 ID 또는 사용자 모델 인스턴스를 사용할 수 있습니다. 🎜$browser->drag('.from-selector', '.to-selector');🎜🎜{note}
loginAs
메서드를 사용한 후 사용자의 세션은 다른 테스트 사례에서 사용할 수 있도록 유지됩니다. 🎜🎜🎜🎜🎜데이터베이스 마이그레이션
🎜위의 인증 예와 마찬가지로 When 테스트 사례를 마이그레이션해야 한다면RefreshDatabase
특성을 사용하면 안 됩니다. RefreshDatabase
특성은 HTTP 요청에 적용할 수 없는 데이터베이스 트랜잭션을 사용합니다. 대신 DatabaseMigrations
특성을 사용하겠습니다: 🎜$browser->dragLeft('.selector', 10); $browser->dragRight('.selector', 10); $browser->dragUp('.selector', 10); $browser->dragDown('.selector', 10);🎜🎜🎜
요소와 상호작용
🎜🎜🎜황혼 선택기
🎜선택 요소 상호 작용을 위한 좋은 CSS 선택기는 Dush 테스트 작성에서 가장 어려운 부분 중 하나입니다. 시간이 지남에 따라 프런트엔드 변경으로 인해 다음과 같은 CSS 선택기가 테스트를 중단할 수 있습니다. 🎜// 等待对话框显示: $browser->waitForDialog($seconds = null); // 断言对话框已经显示,并且其消息与给定值匹配: $browser->assertDialogOpened('value'); // 在打开的 JavaScript 提示对话框中输入给定值: $browser->typeInDialog('Hello World');🎜Dusk 선택기를 사용하면 CSS 선택기를 기억하는 대신 효과적인 테스트 작성에 집중할 수 있습니다. 선택기를 정의하려면 HTML 요소에
dusk
속성을 추가하기만 하면 됩니다. 그런 다음 선택기 앞에 @
를 추가하여 Dusk 테스트에서 추가 요소를 작동합니다. 🎜$browser->acceptDialog();🎜🎜🎜
링크 클릭
🎜링크를 클릭하려면 브라우저 인스턴스에서clickLink
메소드를 사용할 수 있습니다. clickLink
메소드는 지정된 표시 텍스트가 있는 링크를 클릭합니다. 🎜$browser->dismissDialog();🎜🎜{Note} 이 메소드는 jQuery와 상호 작용할 수 있습니다. 페이지에 jQuery가 없으면 Dusk는 테스트 중에 jQuery를 사용할 수 있도록 페이지에 자동으로 삽입합니다. 🎜🎜🎜🎜🎜🎜🎜🎜
텍스트, 값 및 속성
값 검색 및 설정
Dusk는 현재 표시된 텍스트, 값 및 속성과 상호 작용할 수 있는 여러 가지 방법을 제공합니다. 예를 들어, 지정된 선택기와 일치하는 요소의 "값"을 얻으려면 value
메서드를 사용하세요: value
方法:
$browser->with('.table', function ($table) { $table->assertSee('Hello World') ->clickLink('Delete'); });
检索文本
text
这个方法可以用来匹配指定选择器中元素的显示文本:
$browser->pause(1000);
检索属性
最后,attribute
这个方法 可以用来匹配指定选择器中元素的属性:
// 等待选择器 5 秒时间... $browser->waitFor('.selector'); // 等待选择器 1 秒时间... $browser->waitFor('.selector', 1);
表单的使用
输入值
Dusk 提供了与表单和 input 元素交互的各种方法。首先让我们看一个在 input 框中输入文本的例子:
$browser->waitUntilMissing('.selector'); $browser->waitUntilMissing('.selector', 1);
注意, 虽然 type
方法可以传递 CSS 选择器做为一个参数,但这并不是强制要求的。如果没有提供 CSS 选择器, Dusk 会搜索与 name
属性相同的 input 。如果还是没有找到,Dusk 会尝试查找传入值与 name
属性相同的 textarea
。
要想将文本附加到一个字段之后而且不清除其内容, 你可以使用 append
方法:
$browser->whenAvailable('.modal', function ($modal) { $modal->assertSee('Hello World') ->press('OK'); });
你可以使用 clear
方法清除输入值:
// 等待指定文本 5 秒时间... $browser->waitForText('Hello World'); // 等待指定文本 1 秒时间... $browser->waitForText('Hello World', 1);
下拉菜单
需要在下拉菜单中选择值,你可以使用 select
方法。 类似于 type
方法, select
方法并不是一定要传入 CSS 选择器。 当使用 select
方法时,你应该传递选项实际的值而不是它的显示文本:
// 等待指定链接 5 秒时间... $browser->waitForLink('Create'); // 等待给定链接 2 秒时间... $browser->waitForLink('Create', 1);
你也可以通过省略第二个参数来随机选择一个选项:
$browser->waitForLocation('/secret');
复选框
使用「check」 复选框时,你可以使用 check
方法。 像其他许多与 input 相关的方法,并不是必须传入 CSS 选择器。 如果准确的选择器无法找到的时候,Dusk 会搜索能够与 name
属性匹配的复选框:
$browser->waitForRoute($routeName, $parameters);
单选按钮
使用 「select」中单选按钮选项时,你可以使用 radio
这个方法。 像很多其他的与输入相关的方法一样, 它也并不是必须传入 CSS 选择器。如果准确的选择器无法被找到的时候, Dusk 会搜索能够与 name
属性或者 value
$browser->click('.some-action') ->waitForReload() ->assertSee('something');
Retrieve text text
이 메소드는 지정된 선택기에서 요소의 표시된 텍스트를 일치시키는 데 사용할 수 있습니다:
//等待表达式为 true 5 秒时间... $browser->waitUntil('App.dataLoaded'); $browser->waitUntil('App.data.servers.length > 0'); // 等待表达式为 true 1 秒时间... $browser->waitUntil('App.data.servers.length > 0', 1);
// 等待组件属性包含给定值... $browser->waitUntilVue('user.name', 'Taylor', '@user'); // 等待组件属性不包含给定值... $browser->waitUntilVueIsNot('user.name', null, '@user');🎜🎜🎜
$browser->waitUsing(10, 1, function () use ($something) { return $something->isReady(); },"Something wasn't ready in time.");🎜
type
메소드가 CSS 선택기를 매개변수로 전달할 수 있지만 필수는 아닙니다. CSS 선택기가 제공되지 않으면 Dusk는 동일한 name
속성을 가진 입력을 검색합니다. 그래도 찾지 못하면 Dusk는 name
속성과 동일한 값을 가진 textarea
를 찾으려고 시도합니다. 🎜🎜내용을 지우지 않고 필드에 텍스트를 추가하려면 append
메서드를 사용하세요. 🎜// HTML... <profile dusk="profile-component"></profile> // 定义组件... Vue.component('profile', { template: '<div>{{ user.name }}</div>', data: function () { return { user: { name: 'Taylor' } }; } });🎜
clear
메서드를 사용하면 입력 값을 지울 수 있습니다. 🎜 /** * 一个简单的 Vue 测试例子。 * * @return void */ public function testVue(){ $this->browse(function (Browser $browser) { $browser->visit('/') ->assertVue('user.name', 'Taylor', '@profile-component'); }); }
select
방법을 사용할 수 있습니다. . type
메소드와 유사하게 select
메소드는 CSS 선택기를 전달할 필요가 없습니다. select
메서드를 사용할 때 표시 텍스트가 아닌 옵션의 실제 값을 전달해야 합니다. 🎜$browser->assertTitle($title);🎜 두 번째 인수를 생략하여 옵션을 무작위로 선택할 수도 있습니다: 🎜
$browser->assertTitleContains($title);
check
메소드를 사용할 수 있습니다. 다른 많은 입력 관련 메서드와 마찬가지로 CSS 선택기를 전달할 필요가 없습니다. 정확한 선택기를 찾을 수 없는 경우 Dusk는 name
속성과 일치하는 체크박스를 검색합니다: 🎜$browser->assertUrlIs($url);
radio
메소드를 사용할 수 있습니다. 다른 많은 입력 관련 방법과 마찬가지로 CSS 선택기를 전달할 필요가 없습니다. 정확한 선택기를 찾을 수 없는 경우 Dusk는 name
속성 또는 value
속성과 일치하는 라디오 버튼을 검색합니다. 🎜$browser->assertSchemeIs($scheme);🎜🎜🎜🎜🎜🎜
Attachment
attach
메소드는 file
입력 요소에 파일을 첨부할 수 있습니다. 다른 많은 입력 관련 방법과 마찬가지로 CSS 선택기를 전달할 필요가 없습니다. 정확한 선택기를 찾을 수 없는 경우 Dusk는 name
속성과 일치하는 파일 입력 상자를 검색합니다. attach
方法可以附加一个文件到 file
input 元素中。 像很多其他的与输入相关的方法一样,他也并不是必须传入 CSS 选择器。如果准确的选择器没有被找到的时候, Dusk 会搜索与 name
属性匹配的文件输入框:
$browser->assertSchemeIsNot($scheme);
{注意} attach 方法需要使用 PHP
Zip
扩展,你的服务器必须安装了此扩展。
使用键盘
keys
方法让你可以再指定元素中输入比 type
方法更加复杂的输入序列。例如,你可以在输入值的同时按下按键。在这个例子中,输入 taylor
时, shift
键也同时被按下。当 taylor
输入完之后, 将会输入 otwell
而不会按下任何按键:
$browser->assertHostIs($host);
你甚至可以在你的应用中选中某个元素之后按下「快捷键」:
$browser->assertHostIsNot($host);
{提示} 所有包在
{}
中的键盘按键, 都对应定义于FacebookWebDriverWebDriverKeys
类中,你可以在 GitHub 中找到。
使用鼠标
点击元素
click
方法可用于「点击」与给定选择器匹配的元素:
$browser->assertPortIs($port);
鼠标悬停
mouseover
方法可用于与给定选择器匹配的元素的鼠标悬停动作:
$browser->assertPortIsNot($port);
拖放
drag
方法用于将与指定选择器匹配的元素拖到其它元素:
$browser->assertPathBeginsWith($path);
或者,可以在单一方向上拖动元素:
$browser->assertPathIs('/home');
JavaScript 对话框
Dusk 提供了几种与 JavaScript 对话框交互的方法:
$browser->assertPathIsNot('/home');
通过点击确定按钮关闭打开的 JavaScript 对话框:
$browser->assertRouteIs($name, $parameters);
通过点击取消按钮关闭打开的 JavaScript 对话框(仅对确认对话框有效):
$browser->assertQueryStringHas($name);
选择器作用范围
有时可能希望在给定的选择器范围内执行多个操作。比如,可能想要断言表格中存在某些文本,然后点击表格中的一个按钮。可以使用 with
$browser->assertQueryStringHas($name, $value);
{참고} 첨부 방법에는 PHP Zip 코드가 필요합니다. > 확장을 사용하려면 서버에 이 확장이 설치되어 있어야 합니다.
키
메소드 type
메소드보다 지정된 요소에 더 복잡한 입력 시퀀스를 입력할 수 있습니다. 예를 들어 값을 입력하는 동안 키를 누를 수 있습니다. 이 예에서는 taylor
를 입력할 때 shift
키도 눌려 있습니다. taylor
입력이 끝나면 아무 키도 누르지 않고 otwell
이 입력됩니다. 🎜$browser->assertQueryStringMissing($name);🎜 앱에서 요소를 선택하고 "단축키"를 누를 수도 있습니다. 🎜
$browser->assertFragmentIs('anchor');
🎜{Tips}🎜🎜🎜{}
에 패키지된 모든 키보드 키는FacebookWebDriverWebDriverKeys
클래스에 상응하게 정의되어 있습니다. href="https://github.com/ facebook/php-webdriver/blob/community/lib/WebDriverKeys.php">GitHub🎜을 찾았습니다. 🎜
요소 클릭
🎜click
메소드는 주어진 선택기와 일치하는 요소를 "클릭"하는 데 사용할 수 있습니다: 🎜$browser->assertFragmentBeginsWith('anchor');
Mouseover
🎜mouseover
메소드는 주어진 선택기와 일치하는 요소에 대한 마우스 오버 작업에 사용할 수 있습니다: 🎜$browser->assertFragmentIsNot('anchor');
드래그 앤 드롭
🎜드래그
메소드는 지정된 선택기와 일치하는 요소를 다른 요소로 드래그하는 데 사용됩니다. 🎜$browser->assertHasCookie($name);🎜또는 요소는 한 방향으로 드래그하세요: 🎜
$browser->assertCookieMissing($name);🎜🎜🎜
$browser->assertCookieValue($name, $value);🎜 확인 버튼을 클릭하여 열려 있는 JavaScript 대화 상자를 닫습니다. 🎜
$browser->assertPlainCookieValue($name, $value);🎜 취소 버튼을 클릭하여 열려 있는 JavaScript 대화 상자를 닫습니다(확인 대화 상자에만 유효): 🎜
$browser->assertSee($text);🎜🎜🎜
with
메서드를 사용하여 달성할 수 있습니다. 콜백 함수 내에서 수행되는 모든 작업은 원래 선택기로 제한됩니다: 🎜$browser->assertDontSee($text);🎜🎜🎜🎜🎜🎜
Waiting for Elements
JavaScript를 광범위하게 사용하는 애플리케이션을 테스트할 때 테스트하기 전에 지정된 요소나 데이터를 사용할 수 있을 때까지 "대기"해야 하는 경우가 많습니다. 황혼이 더 쉬워집니다. 일련의 방법을 사용하면 페이지 요소를 사용할 수 있을 때까지 또는 특정 JavaScript 표현식이 true
로 평가될 때까지 기다릴 수 있습니다. true
。
等待
如果需要测试暂停指定的毫秒数,可以使用 pause
方法:
$browser->assertSeeIn($selector, $text);
等待选择器
waitFor
方法可以用于暂停执行测试,直到页面上与给定 CSS 选择器匹配的元素被显示。默认情况下,将在暂停超过 5 秒后抛出异常。如果有必要,可以传递自定义超时时长作为其第二个参数:
$browser->assertDontSeeIn($selector, $text);
还可以等待指定选择器从页面消失:
$browser->assertSourceHas($code);
选择器可用时限定作用域范围
偶尔可能希望等待选择器然后与其互动。例如,可能希望等待模态窗口可用,然后点击模态窗口的「确定」按钮。 whenAvailable
方法能够用于这种情况。给定回调内的所有要执行的元素操作都将被限定在起始选择器上:
$browser->assertSourceMissing($code);
等待文本
waitForText
方法可以用于等待页面上给定文字被显示:
$browser->assertSeeLink($linkText);
等待链接
waitForLink
方法用于等待给定链接文字在页面上显示:
$browser->assertDontSeeLink($linkText);
等待页面跳转
在给出类似 $browser->assertPathIs('/home')
路径断言时,如果 window.location.pathname
被异步更新,断言就会失败。可以使用 waitForLocation
方法等待页面跳转到给定路径:
$browser->assertInputValue($field, $value);
还可以等待被命名的路由跳转:
$browser->assertInputValueIsNot($field, $value);
等待页面重新加载
如果要在页面重新加载后断言,可以使用 waitForReload
方法:
$browser->assertChecked($field);
等待 JavaScript 表达式
有时会希望暂停执行测试,直到给定的 JavaScript 表达式执行结果为 true
。可以使用 waitUntil
方法轻易地达成此目的。传送一个表达式给此方法,不需要包含 return
지정된 밀리초 동안 일시 중지를 테스트해야 하는 경우 pause
메서드를 사용할 수 있습니다.
$browser->assertNotChecked($field);
waitFor
메서드를 사용하면 페이지의 요소가 지정된 CSS와 일치할 때까지 테스트 실행을 일시 중지할 수 있습니다. 선택기가 표시됩니다. 기본적으로 5초 이상 일시 중지되면 예외가 발생합니다. 필요한 경우 사용자 정의 시간 초과를 두 번째 매개변수로 전달할 수 있습니다: 🎜$browser->assertRadioSelected($field, $value);🎜 지정된 선택기가 페이지에서 사라질 때까지 기다릴 수도 있습니다: 🎜
$browser->assertRadioNotSelected($field, $value);
whenAvailable
메서드를 사용할 수 있습니다. 지정된 콜백 내에서 수행되는 모든 요소 작업은 시작 선택기로 제한됩니다: 🎜$browser->assertSelected($field, $value);
waitForText< /code > 메소드를 사용하여 페이지에 지정된 텍스트가 표시될 때까지 기다릴 수 있습니다: 🎜$browser->assertNotSelected($field, $value);
🎜🎜Wait for the link🎜🎜waitForLink
메소드가 사용됩니다. 주어진 링크 텍스트가 페이지에 표시될 때까지 기다립니다: 🎜$browser->assertSelectHasOptions($field, $values);
🎜🎜페이지가 점프할 때까지 기다립니다🎜🎜$browser->assertPathIs(' /home')
경로를 어설션할 때 window.location.pathname
이 비동기적으로 업데이트되면 어설션이 실패합니다. waitForLocation
메서드를 사용하면 페이지가 지정된 경로로 이동할 때까지 기다릴 수 있습니다. 🎜$browser->assertSelectMissingOptions($field, $values);
🎜 명명된 경로가 이동할 때까지 기다릴 수도 있습니다. 🎜$browser->assertSelectHasOption($field, $value);
🎜🎜페이지 다시 로드를 기다리세요🎜🎜페이지가 다시 로드된 후에 어설션하려면 waitForReload
메서드를 사용할 수 있습니다: 🎜$browser->assertValue($selector, $value);
🎜🎜JavaScript 표현식 대기 🎜🎜 때로는 주어진 JavaScript 표현식이 true
로 평가될 때까지 테스트 실행을 일시 중지하고 싶을 때가 있습니다. 이는 waitUntil
메서드를 사용하여 쉽게 수행할 수 있습니다. return
키워드나 닫는 세미콜론을 포함하지 않고 이 메서드에 표현식을 전달합니다. 🎜$browser->assertVisible($selector);
🎜🎜🎜Await Vue 표현식 🎜🎜다음 메서드는 지정된 Vue 구성 요소 속성을 포함하거나 수행하는 것을 기다리는 데 사용할 수 있습니다. 주어진 값을 포함하지 않음: 🎜$browser->assertPresent($selector);
🎜🎜콜백 대기
Dusk의 "대기" 메소드 중 다수는 최대 대기 시간(초), 클로저 실행 사이의 간격, 실행 중인 클로저 및 신뢰할 수 있는 실패 메시지를 허용하는 기본 waitUsing
方法。可以直接使用此方法来等待给定的回调返回 true
。 waitUsing
메소드에 의존합니다.
$browser->assertMissing($selector);
Make Vue Assertions
Dusk를 사용하면 Vue 구성 요소 데이터의 상태에 대한 단언도 할 수 있습니다. 예를 들어 애플리케이션에 다음 Vue 구성 요소가 포함되어 있다고 가정합니다.
$browser->assertDialogOpened($message);
Vue 구성 요소의 상태에 대해 다음과 같은 어설션을 만들 수 있습니다.
$browser->assertEnabled($field);
사용 가능한 Assertions
Dusk는 일련의 사용 가능한 Assertion 메서드를 제공합니다. 모든 주장은 다음과 같습니다:
assertTitle
assertTitleContains
assertUrlIs
assertSchemeIs
assertSchemeIsNot
assertHostIs
assertHostIsNot
assertPortIs
assertPortIsNot
assertPathBeginsWith
assertPathIs
assertPathIsNot
assertRouteIs
assertQueryStringHas
assertQueryStringMissing
assertFragmentIs
assertFragmentBeginsWith
assertFragmentIsNot
assertHa sCookie
assertCookieMissing
assertCookieValue
assertPlainCookieValue
assertSee
assertDontSee
assertSeeIn
assertDontSeeIn
assertSourceHas
assertSourceMissing
assertSeeLink
assertDontSeeLink
assertInputValue
assertInputValue IsNot
assertChecked
assertNotChecked
assertRadioSelected
assertRadioNotSelected
assertSelected
assertNotSelected
assertSelectHasOptions
assertSelectMissingOptions
assertSelectHasOption
assertValue
assertVisible
assertPresent
assertMissing
assertDialogOpened
assertEnabled
assertDisabled
assertFocused
assertNotFocused
assertVue
assertVueIsNot
assertVueContains
assertVueDoesNotContain
assertTitle
페이지 제목이 지정된 텍스트와 일치하는지 확인:
$browser->assertDisabled($field);
assertTitleContains
페이지 제목에 지정된 텍스트가 포함되어 있는지 확인:
$browser->assertFocused($field);
assertUrlIs
현재 URL(쿼리 문자열 없음)이 지정된 문자열과 일치하는지 확인:
$browser->assertNotFocused($field);
assertSchemeIs
현재 URL이 지정된 문자열과 일치하는지 확인:
rreeeassertSchemeIsNot
현재 URL이 주어진 문자열과 일치하는지 확인:
$browser->assertVue($property, $value, $componentSelector = null);
assertHostIs
현재 URL의 호스트가 지정된 값과 일치하는지 확인:
$browser->assertVueIsNot($property, $value, $componentSelector = null);
assertHostIsNot
현재 URL의 호스트가 지정된 값과 일치하지 않는지 확인:
$browser->assertVueContains($property, $value, $componentSelector = null);
assertPortIs
현재 URL의 포트 값이 지정된 값과 일치하는지 확인:
$browser->assertVueDoesNotContain($property, $value, $componentSelector = null);
assertPortIsNot
현재 URL의 포트 값이 지정된 값과 일치하지 않는지 확인:
php artisan dusk:page Login
assertPathBeginsWith
현재 URL이 지정된 경로로 시작하는지 확인:
/**
* 获得页面 URL 路径。
*
* @return string
*/
public function url(){
return '/login';
}
현재 경로가 지정된 경로와 일치하는지 확인: /**
* 断言浏览器当前处于指定页面。
*
* @return void
*/
public function assert(Browser $browser){
$browser->assertPathIs($this->url());
}
assertPathIsNot현재 경로가 지정된 경로와 일치하지 않는지 확인: use Tests\Browser\Pages\Login;$browser->visit(new Login);
assertRouteIs 현재 URL이 명명된 경로의 지정된 URL과 일치하는지 확인: use Tests\Browser\Pages\CreatePlaylist;$browser->visit('/dashboard')
->clickLink('Create Playlist')
->on(new CreatePlaylist)
->assertSee('@create');
assertQueryStringHas지정된 쿼리 문자열 매개변수가 존재하는지 확인: /**
* 获取页面的元素简写。
*
* @return array
*/
public function elements(){
return [
'@email' => 'input[name=email]',
];
}
지정된 쿼리 문자열 매개변수가 있는지 확인 존재하고 지정된 값이 있음: $browser->type('@email', 'taylor@laravel.com');
assertQueryStringMissing지정된 쿼리 문자열 매개 변수가 존재하지 않는지 확인: /**
* 获取站点全局的选择器简写。
*
* @return array
*/
public static function siteElements(){
return [
'@element' => '#selector',
];
}
assertFragmentIs
현재 조각이 지정된 조각과 일치하는지 확인:
<?php
namespace Tests\Browser\Pages;
use Laravel\Dusk\Browser;
class Dashboard extends Page{
// 其他页面方法...
/**
* 创建一个新的播放列表。
*
* @param \Laravel\Dusk\Browser $browser
* @param string $name
* @return void
*/
public function createPlaylist(Browser $browser, $name)
{
$browser->type('name', $name)
->check('share')
->press('Create Playlist');
}
}
assertFragmentBeginsWith
현재 조각이 지정된 조각으로 시작하는지 확인:
use Tests\Browser\Pages\Dashboard;$browser->visit(new Dashboard)
->createPlaylist('My Playlist')
->assertSee('My Playlist');
assertFragmentIsNot
Assert 현재 샤드가 지정된 샤드와 일치하지 않음:
php artisan dusk:component DatePicker
assertHasCookie
지정된 쿠키가 존재하는지 확인:
<?php
namespace Tests\Browser\Components;
use Laravel\Dusk\Browser;
use Laravel\Dusk\Component as BaseComponent;
class DatePicker extends BaseComponent{
/**
* 获取组件的 root selector
*
* @return string
*/
public function selector()
{
return '.date-picker';
}
/**
* 浏览器包含组件的断言
*
* @param Browser $browser
* @return void
*/
public function assert(Browser $browser)
{
$browser->assertVisible($this->selector());
}
/**
* 读取组件的元素快捷方式
*
* @return array
*/
public function elements()
{
return [
'@date-field' => 'input.datepicker-input',
'@month-list' => 'div > div.datepicker-months',
'@day-list' => 'div > div.datepicker-days',
];
}
/**
* 选择给定日期
*
* @param \Laravel\Dusk\Browser $browser
* @param int $month
* @param int $day
* @return void
*/
public function selectDate($browser, $month, $day)
{
$browser->click('@date-field')
->within('@month-list', function ($browser) use ($month) {
$browser->click($month);
})
->within('@day-list', function ($browser) use ($day) {
$browser->click($day);
});
}
}
assertCookieMissing
지정된 쿠키가 존재하지 않는지 확인 :
<?php
namespace Tests\Browser;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Tests\Browser\Components\DatePicker;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ExampleTest extends DuskTestCase{
/**
* 基本的组件测试示例
*
* @return void
*/
public function testBasicExample()
{
$this->browse(function (Browser $browser) {
$browser->visit('/')
->within(new DatePicker, function ($browser) {
$browser->selectDate(1, 2018);
})
->assertSee('January');
});
}
}
assertCookieValue
쿠키가 지정된 값으로 존재하는지 확인:
version: 2jobs:
build:
steps:
- run: sudo apt-get install -y libsqlite3-dev
- run: cp .env.testing .env
- run: composer install -n --ignore-platform-reqs
- run: npm install
- run: npm run production
- run: vendor/bin/phpunit
- run:
name: Start Chrome Driver
command: ./vendor/laravel/dusk/bin/chromedriver-linux
background: true
- run:
name: Run Laravel Server
command: php artisan serve
background: true
- run:
name: Run Laravel Dusk Tests
command: php artisan dusk
assertPlainCookieValue
ed 쿠키가 지정된 값으로 존재합니다:
phpenv local 7.2
cp .env.testing .env
mkdir -p ./bootstrap/cache
composer install --no-interaction --prefer-dist
php artisan key:generate
nohup bash -c "php artisan serve 2>&1 &" && sleep 5
php artisan dusk
assertSee
지정된 텍스트가 현재 페이지에 존재하는지 확인:
{ "environments": {
"test": {
"buildpacks": [
{ "url": "heroku/php" },
{ "url": "https://github.com/heroku/heroku-buildpack-google-chrome" }
],
"scripts": {
"test-setup": "cp .env.testing .env",
"test": "nohup bash -c './vendor/laravel/dusk/bin/chromedriver-linux > /dev/null 2>&1 &' && nohup bash -c 'php artisan serve > /dev/null 2>&1 &' && php artisan dusk"
}
}
}
}
assertDontSee
지정된 텍스트가 현재 페이지에 존재하지 않는지 확인:
language: php
php:
- 7.3
addons:
chrome: stable
install:
- cp .env.testing .env
- travis_retry composer install--no-interaction --prefer-dist --no-suggest
- php artisan key:generate
before_script:
- google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &
- php artisan serve &
script:
- php artisan dusk
assertSeeIn
선택기가 범위 내에 존재하는지 확인 지정된 텍스트:
APP_URL=http://127.0.0.1:8000
assertDontSeeIn
지정된 텍스트가 선택기 범위 내에 존재하지 않는지 확인:
rrreeeassertSourceHas
지정된 소스 코드가 현재 페이지에 존재하는지 확인:
rrreeeassertSourceMissing
지정된 소스 코드가 현재 페이지에 존재하지 않는지 확인:
rrreee assertSeeLink
지정된 링크가 현재 페이지에 존재하는지 확인:
rrreeeassertDontSeeLink
지정된 링크가 현재 페이지에 존재하지 않는지 확인:
rrreee AssertInputValue
입력 상자에 지정된 값이 있는지 확인:
rrreeeassertInputValueIsNot
Assert 입력 지정된 값을 가진 상자가 존재하지 않음:
rrreeeassertChecked
지정된 것을 주장합니다. 확인란이 선택되어 있음:
rrreeeassertNotChecked
지정된 확인란이 선택되어 있지 않은지 확인:
rrreeeassertRadioSelected
지정된 라디오 버튼이 선택되었는지 확인:
rrreee assertRadioNotSelected
지정된 라디오 어설션 선택 버튼이 선택되지 않았습니다:
rrreeeassertSelected
드롭다운 상자가 지정된 값으로 선택되었는지 확인:
rrreeeassertNotSelected
Assert 그 드롭- 다운 상자가 지정된 값으로 선택되지 않았습니다. 값:
rrreee assertSelectHasOptions
선택한 값이 지정된 배열의 값이 아닌지 확인:
rrreee assertSelectHasOption
주장 지정된 값에 대한 선택 사항:
rrreeeassertValue
선택기 범위 내의 요소가 지정된 값으로 존재하는지 확인:
rrreee assertVisible
assert 요소 선택기 범위 내에서 표시됨:
rrreeeassertPresent
선택기 범위 내의 요소가 존재하는지 확인:
rrreeeassertMissing
선택기 범위 내의 요소 확인 존재하지 않음:
rrreee assertDialogOpened지정된 메시지가 포함된 JavaScript 대화 상자가 열렸는지 확인:
rrreeeassertEnabled
지정된 필드가 활성화되었는지 확인:
rrreeeassertDisabled
지정된 필드가 비활성화되었는지 확인:
rrreeeassertFocused
포커스가 지정된 필드에 있는지 확인:
rrreeeassertNotFocused
assert 포커스가 지정된 필드에 있지 않습니다:
rrreeeassertVue
Vue 구성 요소 데이터의 속성이 지정된 값과 일치하는지 확인:
rrreeeassertVueIsNot
Vue 구성 요소 데이터의 속성이 지정된 값과 일치하지 않는지 확인:
rrreeeassertVueContains
Vue 구성 요소 데이터의 속성이 배열이고 배열에 다음이 포함되어 있는지 확인 지정된 값:
rrreeeassertVueDoesNotContain
Vue 구성 요소 데이터의 속성이 배열이고 배열에 지정된 값이 포함되어 있지 않은지 확인:
rrreeePage
때로는 일련의 복잡한 작업을 테스트해야 할 때가 있습니다. 이로 인해 테스트 코드를 읽고 이해하기 어려울 수 있습니다. 페이지를 통해 시맨틱 액션을 정의한 후 지정된 페이지에서 단일 메서드를 사용할 수 있습니다. 페이지에서는 애플리케이션이나 개별 페이지에 공통적인 선택기에 대한 바로가기를 정의할 수도 있습니다.
페이지 생성
dusk:page
Artisan 명령은 페이지 개체를 생성할 수 있습니다. 모든 페이지 개체는 tests/Browser/Pages
디렉터리에 있습니다: dusk:page
Artisan 命令可以生成页面对象。所有的页面对象都位于 tests/Browser/Pages
目录:
rrreee配置页面
页面默认拥有 3 个方法: url
, assert
和 elements
。 在这里我们先详述 url
和 assert
方法, elements
方法将会 选择器简写 中详述。
url
方法
url
方法应该返回表示页面 URL 的路径。 Dusk 将会在浏览器中使用这个 URL 来导航到具体页面:
rrreeeassert
方法
assert
方法可以作出任何断言来验证浏览器是否在指定页面上。这个方法并不是必须的。你可以根据你自己的需求来做出这些断言。这些断言会在你导航到这个页面的时候自动执行:
rrreee导航至页面
一旦页面配置好之后,你可以使用 visit
方法导航至页面:
rrreee有时候,你可能已经在指定页面了,你需要的只是「加载」当前页面的选择器和方法到当前测试中来。常见的例子有:当你按下一个按钮的时候,你会被重定向至指定页面,而不是直接导航至指定页面。在这种情况下,你需要使用 on
rrreee
구성 페이지이 페이지에는 기본적으로 url
, assert
및 elements
의 3가지 메소드가 있습니다. 여기서는 먼저 url
및 assert
메소드를 자세히 설명합니다. elements
메소드는 입니다. 선택기 약어는 🎜에 자세히 설명되어 있습니다. 🎜🎜🎜url
메소드 🎜🎜url
메소드는 페이지의 URL을 나타내는 경로를 반환해야 합니다. Dusk는 브라우저에서 다음 URL을 사용하여 특정 페이지로 이동합니다: 🎜rrreee🎜🎜assert
method 🎜🎜assert < /code> 메소드는 브라우저가 지정된 페이지에 있는지 확인하기 위해 어설션을 만들 수 있습니다. 이 방법은 필수가 아닙니다. 자신의 필요에 따라 이러한 어설션을 만들 수 있습니다. 다음 페이지로 이동하면 다음 어설션이 자동으로 실행됩니다: 🎜rrreee🎜🎜🎜🎜🎜페이지로 이동 🎜🎜페이지가 구성되면 visit
메소드를 사용하여 페이지를 탐색할 수 있습니다: 🎜rrreee🎜 때로는 이미 지정된 페이지에 있을 수 있으며 필요한 것은 해당 페이지를 "로드"하는 것뿐입니다. 현재 페이지를 선택하면 생성자와 메소드가 현재 테스트에 추가됩니다. 일반적인 예는 다음과 같습니다. 버튼을 누르면 지정된 페이지로 직접 이동하는 대신 지정된 페이지로 리디렉션됩니다. 이 경우 on
메소드를 사용하여 페이지를 로드해야 합니다: 🎜rrreee🎜🎜🎜🎜🎜🎜Selector 단축어
elements
메서드를 사용하면 페이지의 모든 CSS 선택기에 대해 간단하고 기억하기 쉬운 단축어를 정의할 수 있습니다. 예를 들어, 앱 로그인 페이지의 email
입력 필드에 대한 약어를 정의해 보겠습니다. elements
方法允许你为页面中的任何 CSS 选择器定义简单易记的简写。例如,让我们为应用登录页中的 email
输入框定义一个简写:
rrreee现在你可以用这个简写来代替之前在页面中使用的完整 CSS 选择器:
rrreee全局的选择器简写
安装 Dusk 之后,Page
基类存放在你的 tests/Browser/Pages
目录。该类中包含一个 siteElements
方法,这个方法可以用来定义全局的选择器简写,这样在你应用中每个页面都可以使用这些全局选择器简写了:
rrreee页面方法
除了页面中已经定义的默认方法之外,你还可以定义在整个测试过程中会使用到的其他方法。例如,假设我们正在开发一个音乐管理应用,在应用中都可能需要一个公共的方法来创建列表,而不是在每一页、每一个测试类中都重写一遍创建播放列表的逻辑,这时候你可以在你的页面类中定义一个 createPlaylist
方法:
rrreee方法被定义之后,你可以在任何使用到该页的测试中使用这个方法了。浏览器实例会自动传递该页面方法:
rrreee组件
组件类似于 Dusk 的 「页面对象」,不过它更多的是贯穿整个应用程序中频繁重用的 UI 和功能片断,比如说导航条或信息通知弹窗。因此,组件并不会绑定于某个明确的 URL。
组件的生成
为了生成一个组件,使用 Artisan 命令 dusk:component
即可生成组件。新生成的组件位于 test/Browser/Components
rrreee
이제 이전에 페이지에서 사용했던 전체 CSS 선택기 대신 이 약어를 사용할 수 있습니다. rrreee
전역 선택기 약어
Dusk를 설치한 후 페이지
기본 클래스가 테스트에 저장됩니다. / 브라우저/페이지
디렉토리. 이 클래스에는 전역 선택기 약어를 정의하는 데 사용할 수 있는 siteElements
메서드가 포함되어 있으므로 애플리케이션의 각 페이지에서 다음 전역 선택기 약어를 사용할 수 있습니다. rrreee
페이지 방법
페이지에 이미 정의된 기본 방법 외에도 테스트 프로세스 전반에 걸쳐 정의할 수도 있습니다. 에서 사용되는 다른 방법. 예를 들어, 음악 관리 애플리케이션을 개발 중이라고 가정하면, 현재로서는 모든 페이지와 모든 테스트 클래스에서 재생 목록을 생성하는 로직을 다시 작성하는 대신 공개 메서드가 필요할 수 있습니다. 페이지 클래스에 createPlaylist
메서드를 정의하세요.
rrreee 메서드가 정의된 후에는 페이지를 사용하는 모든 테스트에서 이 메서드를 사용할 수 있습니다. 브라우저 인스턴스는 자동으로 페이지 메소드를 전달합니다: rrreee
comComponent
comComponent는 Dusk의 "페이지와 유사합니다. "개체"이지만 탐색 모음이나 정보 알림 팝업 창과 같이 전체 애플리케이션에서 자주 재사용되는 UI 및 기능 조각에 가깝습니다. 따라서 구성 요소는 명시적인 URL에 바인딩되지 않습니다.
🎜컴포넌트 생성🎜🎜컴포넌트를 생성하려면 Artisan 명령어 dusk를 사용하세요: 구성 요소
를 사용하여 구성 요소를 생성합니다. 새로 생성된 구성 요소는 test/Browser/Components
디렉터리에 있습니다. 🎜rrreee🎜위에 표시된 것처럼 이는 다음의 여러 페이지에서 사용할 수 있는 "날짜 선택기" 구성 요소를 생성하는 예입니다. 너의 어플리케이션. 테스트 모음 전체의 수많은 테스트 페이지에서 날짜 선택을 위한 브라우저 자동화 논리를 수동으로 작성하는 것은 번거로운 일입니다. 더 편리한 대안은 날짜 선택기를 나타내는 Dusk 구성 요소를 정의한 다음 구성 요소에 자동화 논리를 캡슐화하는 것입니다. 테스트 페이지 날짜 선택기를 사용하면 날짜를 쉽게 선택할 수 있습니다. 선택한 날짜의 논리를 수정해야 하는 경우 다음 구성 요소를 수정하세요. 🎜rrreee🎜🎜🎜🎜🎜🎜🎜지속적 통합🎜🎜🎜🎜🎜🎜🎜CircleCI
CircleCI를 사용하여 Dusk 테스트를 실행하는 경우 이 구성 파일을 시작점으로 참조할 수 있습니다. TravisCI와 마찬가지로 php artisan Serve
명령을 사용하여 PHP의 내장 웹 서버를 시작합니다: php artisan serve
命令启动 PHP 的内置 Web 服务器:
rrreeeCodeship
在 Codeship 中运行 Dusk 测试,需要在你的 Codeship 项目中添加以下命令。当然,这些命令只是作为范例,你可以根据需要随意添加额外的命令:
rrreeeHeroku CI
在 Heroku CI 中运行 Dusk 测试时,请将下列 Google Chrome 构建包和脚本添加到你的 Heroku app.json
文件中:
rrreeeTravis CI
在 Travis CI 中运行 Dusk 测试时,你可以参考 .travis.yml
的配置。由于 Travis CI 不是图形环境,因此我们需要采取一些额外的步骤来启动 Chrome 浏览器。此外,我们将使用 php artisan serve
启动 PHP 的内置 Web 服务器:
rrreee在 .env.testing
文件中,调整 APP_URL
rrreee
🎜Codeship🎜에서 Dusk 테스트를 실행하려면 Codeship 프로젝트에 다음 명령을 추가해야 합니다. 물론 이러한 명령은 예시일 뿐이므로 필요에 따라 추가 명령을 자유롭게 추가하세요. 🎜rrreee🎜🎜🎜