Внедрение Laravel Dusk на контроллере и ведение процесса при каждом запросе http - PullRequest
0 голосов
/ 26 сентября 2018

Я сейчас работаю с Laravel Dusk.

Я реализую функцию сумерек на моем контроллере.Я собираюсь удаленно в github не через API.Допустим, у меня есть контроллер, состоящий из 3 функций index: отображение формы входа в систему, login: отправка учетных данных в github, logout: выход из github.

это мой контроллер:

<?php

namespace App\Http\Controllers\Modules;

use App\Http\Controllers\Controller;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Laravel\Dusk\Browser;
use Laravel\Dusk\Chrome\ChromeProcess;
use Laravel\Dusk\ElementResolver;
use Illuminate\Http\Request;
use Exception;

class MainController extends Controller {

  public function index(Request $request) {
    return view('github.login');
  }

  public function login(Request $request) {
    $username = $request->input('username');
    $password = $request->input('password');

    $process = (new ChromeProcess)->toProcess();
    if ($process->isStarted()) {
      $process->stop();
    }
    $process->start();

    $options      = (new ChromeOptions)->addArguments(['--disable-gpu', '--headless', '--no-sandbox']);
    $capabilities = DesiredCapabilities::chrome()
      ->setCapability(ChromeOptions::CAPABILITY, $options)
      ->setPlatform('Linux');
    $driver       = retry(5, function () use ($capabilities) {
      return RemoteWebDriver::create('http://localhost:9515', $capabilities, 60000, 60000);
    }, 50);

    $browser = new Browser($driver, new ElementResolver($driver, ''));
    $browser->resize(1920, 1080);
    $browser->visit('https://github.com/login')
      ->type('login', $username)
      ->type('password', $password)
      ->click('#login > form > div.auth-form-body.mt-3 > input.btn.btn-primary.btn-block');
    $browser->driver->takeScreenshot(base_path('tests/Browser/screenshots/logged.png'));
    try {
      $browser->assertPresent('#js-pjax-container > div.shelf.intro-shelf.js-notice > div > div > h2');
      return view('github.dashboard');
    } catch (Exception $exception) {
      $browser->quit();
      $process->stop();
      dd($exception);
    }
  }

  public function logOut() {
    $process = (new ChromeProcess)->toProcess();
    if ($process->isStarted()) {
      $process->stop();
    }
    $process->start();

    $options      = (new ChromeOptions)->addArguments(['--disable-gpu', '--headless', '--no-sandbox']);
    $capabilities = DesiredCapabilities::chrome()
      ->setCapability(ChromeOptions::CAPABILITY, $options)
      ->setPlatform('Linux');
    $driver       = retry(5, function () use ($capabilities) {
      return RemoteWebDriver::create('http://localhost:9515', $capabilities, 60000, 60000);
    }, 50);

    $browser = new Browser($driver, new ElementResolver($driver, ''));
    $browser->resize(1920, 1080);
    try {
      $browser->click('#user-links > li:nth-child(3) > details > summary > span')
        ->click('#user-links > li:nth-child(3) > details > details-menu > ul > li:nth-child(10) > form > button')
        ->assertPresent('body > div.application-main > div.py-6.py-sm-8.jumbotron-codelines > div > div > div.col-md-7.text-center.text-md-left > h1');
      $browser->driver->takeScreenshot(base_path('tests/Browser/screenshots/logged_out.png'));
      return view('github.login');
    } catch (Exception $exception) {
      $browser->quit();
      $process->stop();
      dd($exception);
    }
  }

}

вот мой файл маршрута:

<?php

Route::get('/', 'Modules\MainController@index');
Route::post('login', 'Modules\MainController@login');
Route::get('logout', 'Modules\MainController@logout');

, функция входа в систему работает отлично, но всякий раз, когда я пытаюсь выйти из системы с помощью функции logout, появляется ошибка, которую я обнаружил на своемблок catch, и он показывает так: NoSuchElementException {#189 ▼ -results: array:3 [▶] #message: """ no such element: Unable to locate element: {"method":"css selector","selector":"#user-links > li:nth-child(3) > details > summary > span"}\n (Session info: headless chrome=69.0.3497.81)\n (Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.4.0-135-generic x86_64) """ #code: 0 #file: "/vagrant/proxypay/vendor/facebook/webdriver/lib/Exception/WebDriverException.php" #line: 102 trace: {▶} }

вопрос в том, как продолжить этот сумеречный процесс, похоже, что когда запрос выполняется (возвращается ли true или false), сумерки также останавливаются изаново создайте новый экземпляр, который никак не связан со старым запросом.

, пожалуйста, помогите.

С наилучшими пожеланиями.

1 Ответ

0 голосов
/ 27 сентября 2018

кажется, что я должен ответить на свой вопрос снова ... я нашел решение.Сохранять сгенерированные файлы cookie и повторно использовать этот файл cookie для следующего действия и т. Д.

...