有没有办法在我解决验证码的同时 pause/resume 进行 PHPUnit+Selenium 测试?

Is there a way I can pause/resume a PHPUnit+Selenium test while I solve the CAPTCHA?

所以我正在为一些使用验证码来尝试和停止机器人的表单编写测试脚本。显然,花费数小时而不是数年时间尝试开发一种使用 PHPUnit+Selenium 来打败 CAPTCHA 的方法是没有意义的,但我仍然想构建测试以在页面提交后继续。

我想既然我有多个屏幕,我能做到这一点的最好方法是 运行 在一个屏幕上进行测试,然后使用 executeScript('alert("CAPTCHA time!")'); 或 jQuery 之类的东西让我知道什么时候自己解决验证码,而测试 运行s

但是我看不出如何做到这一点,我想的一个想法是让测试停止但我目前使用的代码

$host = 'http://localhost:4444/wd/hub'; // this is the default
$capabilities = array(WebDriverCapabilityType::BROWSER_NAME => 'firefox');
$this->driver = RemoteWebDriver::create($host, $capabilities, 5000);

// adding cookie
$this->driver->manage()->deleteAllCookies();
$this->driver->manage()->addCookie(array(
  'name' => 'cookie_name',
  'value' => 'cookie_value',
));
$this->cookies = $this->driver->manage()->getCookies();

将只启动一个新的 firefox 浏览器,而不是继续使用已经打开的浏览器。

我的另一个想法是进行测试 "pause" 直到我解决了验证码,然后在我完成后重新启动,但我也不知道该怎么做。除了阅读所有试图找到一个函数的代码之外,我真的没有关于我正在使用的 Webdriver 的良好语法参考指南

那么有什么方法可以在解决 CAPTCHA 的同时 pause/resume 进行 PHPUnit+Selenium 测试?

注意:我使用的 webdriver 是 the Facebook one,我包含这个 __init__.php 文件

<?php
// Copyright 2004-present Facebook. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// interface
require_once('WebDriverSearchContext.php');
require_once('WebDriver.php');
require_once('WebDriverElement.php');
require_once('WebDriverCommandExecutor.php');
require_once('WebDriverAction.php');
require_once('WebDriverEventListener.php');

// abstract class
require_once('interactions/internal/WebDriverKeysRelatedAction.php');
require_once('interactions/internal/WebDriverSingleKeyAction.php');

// class
require_once('WebDriverAlert.php');
require_once('WebDriverBy.php');
require_once('WebDriverDimension.php');
require_once('WebDriverExceptions.php');
require_once('WebDriverExpectedCondition.php');
require_once('WebDriverHasInputDevices.php');
require_once('WebDriverKeys.php');
require_once('WebDriverNavigation.php');
require_once('WebDriverMouse.php');
require_once('WebDriverKeyboard.php');
require_once('WebDriverOptions.php');
require_once('WebDriverPoint.php');
require_once('WebDriverSelect.php');
require_once('WebDriverTargetLocator.php');
require_once('WebDriverTimeouts.php');
require_once('WebDriverWait.php');
require_once('WebDriverWindow.php');
require_once('interactions/WebDriverActions.php');
require_once('interactions/internal/WebDriverMouseAction.php');
require_once('interactions/WebDriverCompositeAction.php');
require_once('interactions/internal/WebDriverButtonReleaseAction.php');
require_once('interactions/internal/WebDriverClickAction.php');
require_once('interactions/internal/WebDriverClickAndHoldAction.php');
require_once('interactions/internal/WebDriverContextClickAction.php');
require_once('interactions/internal/WebDriverCoordinates.php');
require_once('interactions/internal/WebDriverDoubleClickAction.php');
require_once('interactions/internal/WebDriverMouseMoveAction.php');
require_once('interactions/internal/WebDriverMoveToOffsetAction.php');
require_once('internal/WebDriverLocatable.php');
require_once('remote/RemoteMouse.php');
require_once('remote/RemoteKeyboard.php');
require_once('remote/RemoteWebDriver.php');
require_once('remote/RemoteWebElement.php');
require_once('remote/WebDriverBrowserType.php');
require_once('remote/WebDriverCapabilityType.php');
require_once('remote/HttpCommandExecutor.php');
require_once('interactions/internal/WebDriverSendKeysAction.php');
require_once('interactions/internal/WebDriverKeyDownAction.php');
require_once('interactions/internal/WebDriverKeyUpAction.php');

require_once('support/events/EventFiringWebDriver.php');
require_once('support/events/EventFiringWebDriverNavigation.php');
require_once('WebDriverDispatcher.php');
require_once('support/events/EventFiringWebElement.php');

// touch
require_once('interactions/WebDriverTouchScreen.php');
require_once('remote/RemoteTouchScreen.php');
require_once('interactions/WebDriverTouchActions.php');
require_once('interactions/touch/WebDriverTouchAction.php');
require_once('interactions/touch/WebDriverDoubleTapAction.php');
require_once('interactions/touch/WebDriverDownAction.php');
require_once('interactions/touch/WebDriverFlickAction.php');
require_once('interactions/touch/WebDriverFlickFromElementAction.php');
require_once('interactions/touch/WebDriverLongPressAction.php');
require_once('interactions/touch/WebDriverMoveAction.php');
require_once('interactions/touch/WebDriverScrollAction.php');
require_once('interactions/touch/WebDriverScrollFromElementAction.php');
require_once('interactions/touch/WebDriverTapAction.php');
require_once('interactions/touch/WebDriverUpAction.php');

虽然我怀疑我使用的文件与 github 上的文件相比已经过时(确实需要在某些时候升级)

注意 2:我曾建议我们关闭验证码以进行调试,但权力机构拒绝了并且此代码事先存在,所以他们一定有他们的理由让我们不能将其关闭

如果您通过命令行使用 运行 PHPUnit 和 Selenium,您可以使用在 PHP.net 的 Input/output streams page

上找到的 STDIN 示例
$line = trim(fgets(STDIN));

当代码到达那个时间时,一切都会暂停并等待,直到您按下 Enter,所以如果您使用这样的代码

echo "\nCommand: ";
$line = trim(fgets(STDIN));
echo "\nInput = '".$line ."'";

然后您可以在命令行中输入文本,然后您可以使用 selenium 将其输入到 CAPTCHA 表单中。

唯一的问题是,如果让 Selenium 闲置太久,会话就会超时,从而在代码恢复时导致错误(目前正在尝试解决这个问题)