Имитировать HTTP_REFERER в тесте Laravel Dusk?

Есть ли простой способ смоделировать HTTP_REFERER в тесте Dusk? Я использую Laravel\Dusk\Browser и вызываю метод visit() на разных страницах. Это использует драйвер Selenium.


Что-то вроде setReferer ниже:

namespace Example\Tests\Browser\Processes\PublicSite;

class SampleBrowser extends Browser {
    use MakesAssertions, ProvidesAdditionalBrowserActions, WaitsForElements;
    public function __construct(RemoteWebDriver $driver, $resolver = null)
    {
        parent::__construct($driver, new ElementResolver($driver,
                            $resolver->prefix ?? 'body'));
    }
}


class SampleTestCase extends BrowserTestCase
{
    /**
     * Test that the deal builder modal shows up.
     */
    public function testRefererRendering()
    {
        $this->browse(function (SampleBrowser $browser) {
            $browser
                // this is the bit that I want
                ->setReferer('https://example.org/') 
                ->visit('/')
                ->waitForLocation('/?came_via=example.org')
                ->assertCookieValue('came_via', 'example.org');
        });
    }
}

person artlung    schedule 11.03.2019    source источник
comment
Я не думаю, что есть. Dusk не позволяет отправлять пользовательские заголовки.   -  person Jonas Staudenmeir    schedule 11.03.2019
comment
Рад узнать, что я не упустил что-то очевидное @JonasStaudenmeir - есть ли способ расширить драйвер Selenium, чтобы каким-то образом добавить его в среду? Это ново для меня.   -  person artlung    schedule 11.03.2019
comment
Не знаю, но сомневаюсь. Если вы погуглите общую тему, вы обнаружите, что многие люди просят похожие функции. Но ответ всегда один и тот же: миссия Selenium — эмулировать действия пользователя. В вашем случае это будет означать посещение ссылающейся страницы и фактическое нажатие на ссылку. Также связано: stackoverflow.com/q/51711350/4848587   -  person Jonas Staudenmeir    schedule 11.03.2019
comment
Я слышал, что @JonasStaudenmeir. Конечно, переход по внешнему веб-сайту не передается в мою тестовую среду, он передается в мою производственную среду. Что касается ссылки, которую вы разместили, спрашивающий мог утверждать, что текст, уникальный для страницы 404 сайтов, был там.   -  person artlung    schedule 11.03.2019
comment
Что вы можете сделать: посетите страницу перехода и используйте JavaScript, чтобы заменить цель ссылки на тестовый URL. Не очень элегантный, но лучший вариант, который я вижу на данный момент.   -  person Jonas Staudenmeir    schedule 11.03.2019
comment
Покажите свой тестовый класс или фрагмент кода - это очень поможет.   -  person Alex    schedule 24.03.2019
comment
@Alex добавил пример кода.   -  person artlung    schedule 27.03.2019
comment
@artlung это обходной путь, но можете ли вы попробовать посетить веб-сайт реферера, а затем внедрить скрипт, который выполняет window.location = where_you_want?   -  person WoLfulus    schedule 27.03.2019
comment
@WoLfulus, похоже, то же самое, что говорил Йонас Стауденмейр выше. Интересно, нужно ли мне запускать фиктивный экземпляр этого другого веб-сайта, чтобы я случайно не загружал реферальный веб-сайт и не злоупотреблял их ресурсами.   -  person artlung    schedule 27.03.2019
comment
Собираетесь ли вы делать какие-то сложные тесты или просто хотите протестировать редирект? Если вы просто тестируете перенаправление, вы можете сделать запрос без селена, передавая Referer и ища полученный код состояния http и заголовки Location.   -  person WoLfulus    schedule 28.03.2019
comment
@WoLfulus Я не уверен, что понимаю различие. Но если имитировать перенаправление путем подделки заголовков таким образом, что они внедряются, и поэтому приложение/страница отвечает, добавляя файл cookie и строку запроса, этого будет достаточно.   -  person artlung    schedule 28.03.2019
comment
Это просто зависит от того, как приложение устанавливает такую ​​​​информацию (если это javascript во внешнем интерфейсе, это мало поможет). В этом случае вы не будете использовать браузер для выполнения запроса, поэтому вы можете установить реферер на все, что захотите. Затем вы можете проверить файлы cookie и/или перенаправления.   -  person WoLfulus    schedule 28.03.2019
comment
да, это базовый PHP, который выполняет проверку реферера и устанавливает состояние. Спасибо за ответ @WoLfulus!   -  person artlung    schedule 28.03.2019
comment
Я все еще ищу лучшие альтернативы, хотя :/   -  person WoLfulus    schedule 29.03.2019


Ответы (1)


Dusk или любое другое решение для тестирования браузера/Selenium не реализует такую ​​​​функцию, и, похоже, никогда не будет.

См. https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/2047

Опция 1

Перейдите к URL-адресу реферера, затем внедрите скрипт, который заставляет страницу перейти к той, которую вы хотите протестировать.

Вариант 2

Используйте прокси-сервер, который перехватывает запросы и устанавливает реферер на тот, который вы хотите

https://github.com/j-bennet/selenium-referer

Вариант 3

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

Например:

<?php

namespace App\Http\Controllers;

use \Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class HomeController extends Controller
{
    public function home(Request $request)
    {
        $referer = $request->header('Referer');
        if ($referer) {
            return redirect()->route('home', ['came_via' => $referer]);
        }
        return view('welcome');
    }
}

и тесткейс

<?php

namespace Tests\Feature;

use Tests\TestCase;

class RedirectTest extends TestCase
{
    /**
     * A basic redirect example.
     *
     * @return void
     */
    public function testRedirection()
    {
        // Normal request
        $response = $this->get('/');
        $response->assertStatus(200);

        // Referer check redirection
        $referer = 'http://google.com';
        $response = $this->call('GET', '/', [], [], [], ['HTTP_REFERER' => $referer]);
        $response->assertRedirect('/?came_via=' . urlencode($referer));
    }
}

Результат

OK (2 tests, 4 assertions)
person WoLfulus    schedule 28.03.2019