首页 > 解决方案 > 在 Laravel Dusk Stripe 测试中,我该如何修复“在 W3C 合规模式下,框架必须是 WebDriverElement 的实例、整数或空值”

问题描述

我的应用程序是 laravel 框架 5.8,我目前正在将其升级到 6.0。

我的 Laravel Dusk 浏览器测试包括登录 Stripe,在测试应用程序功能之前创建用户和订阅。

我正在使用 Google Chrome 版本 80.0.3987.132(官方版本)(64 位)

我已使用常用命令将 Dusk chrome 驱动程序设置为相同...

php artisan dusk:chrome-driver 80

我的 phpunit 测试现在都运行良好。我的黄昏测试开始运行,但是当他们进入条带登录阶段时,他们返回错误

InvalidArgumentException: In W3C compliance mode frame must be either instance of WebDriverElement, integer or null

引发此错误的 Dusk 测试部分是:

$this->browse(function (Browser $browser) use ($recr1, $screenshotEnabled) {
    $browser->waitFor('iframe[name=__privateStripeFrame5]');
    $browser->driver->switchTo()->frame('__privateStripeFrame5');

我意识到忽略/解决这个问题可能不是最佳做法,但为了保持升级到 laravel 6.0 的移动,我尝试按照以下建议将 w3c 合规性设置为 false:

如何在 chromedriver 中关闭 w3c 以解决错误未知命令:Cannot call non W3C standard command while in W3C

https://github.com/laravel/dusk/issues/624

通过修改 DuskTestCase.php 但无济于事。

protected function driver()
{
    $options = (new ChromeOptions)->addArguments([
        '--disable-gpu',
        '--headless',
        '--no-sandbox',
        '--window-size=1920,1080',

    ]);
        return RemoteWebDriver::create(
        'http://localhost:9515', DesiredCapabilities::chrome()
        ->setCapability(ChromeOptions::CAPABILITY, $options)
        ->setCapability('alwaysMatch', ['goog:chromeOptions' => ['w3c' => false]])
        , 60*1000, 60*1000
    );
}

}

我认为正确的做法实际上是直接解决问题并修改我引用条纹框架的方式,即

            $browser->waitFor('iframe[name=__privateStripeFrame5]');
        $browser->driver->switchTo()->frame('__privateStripeFrame5');

但我不知道该怎么做。

我想我可能需要切换回默认框架,但还没有让它工作......

https://laracasts.com/discuss/channels/laravel/dusk-click-element-in-iframe?page=1

$this->driver->switchTo()->defaultContent()->switchTo()->defaultContent();

任何想法/建议都非常感谢你们。

标签: google-chromelaravel-duskwebdriver-w3c-spec

解决方案


看来我已经解决了问题。

switchTo 没有工作...

            $browser->waitFor('iframe[name=__privateStripeFrame5]');
    $browser->driver->switchTo()->frame('__privateStripeFrame5');

所以我改为使用 insideFrame ...

    $browser
    ->waitFor('iframe[name=__privateStripeFrame5]')
    ->withinFrame('iframe[name=__privateStripeFrame5]', function($browser){
...
        });

感谢 tgugnani 在他的帖子中......

https://www.5balloons.info/working-with-iframe-in-laravel-dusk/


推荐阅读