通过查看SauceLabs.com博客文章(https://saucelabs.com/jobs/1a408cf60af0601f49052f66fa37812c/selenium-server.log)上的原始日志,我能够确定上传文件的JsonWireProtocol应该是/session/<sessionId>/file
,因此,我创建了这个函数添加到php-webdriver-bindings库中:
public function sendFile($value) {
$file = @file_get_contents($value);
if( $file === false ) {
return false;
}
$file = base64_encode($file);
$request = $this->requestURL . "/file";
$session = $this->curlInit($request);
$args = array( 'file' => $file );
$postargs = json_encode($args);
$this->preparePOST($session, $postargs);
$response = trim(curl_exec($session));
$responseValue = $this->extractValueFromJsonResponse($response);
return $responseValue;
}
将此内容添加到 WebDriver.php 文件中。
使用时,只需像这样操作:
...
$file_location = $webdriver->sendFile('http://test.com/some/file.zip');
$file_input = $webdriver->findElementBy(LocatorStrategy::id, 'uploadfile');
$file_input->sendKeys(array($file_location));
希望这能帮助其他开发者,我花了将近3个小时寻找答案。
更新:
由于出现了错误,我不得不进行更改:
Expected there to be only 1 file. There were: 0
希望将这里放置可以得到谷歌搜索结果(我尝试在谷歌上搜索错误信息,但唯一能找到的结果是关于谷歌代码源的参考资料)。
为了解决这个问题,我能够推断出你发送的文件实际上需要被压缩。因此,我增强了源代码,使用了PHP的ZipArchive库。 我会保留旧代码用于记录,但请使用这里的新代码:
public function sendFile($value, $file_extension = '')
{
$zip = new ZipArchive();
$filename_hash = sha1(time().$value);
$zip_filename = "{$filename_hash}_zip.zip";
if( $zip->open($zip_filename, ZIPARCHIVE::CREATE) === false ) {
echo 'WebDriver sendFile $zip->open failed\n';
return false;
}
$file_data = @file_get_contents($value);
if( $file_data === false ) {
throw new Exception('WebDriver sendFile file_get_contents failed');
}
$filename = "{$filename_hash}.{$file_extension}";
if( @file_put_contents($filename, $file_data) === false ) {
throw new Exception('WebDriver sendFile file_put_contents failed');
}
$zip->addFile($filename, "{$filename_hash}.{$file_extension}");
$zip->close();
$zip_file = @file_get_contents($zip_filename);
if( $zip_file === false ) {
throw new Exception('WebDriver sendFile file_get_contents for $zip_file failed');
}
$file = base64_encode($zip_file);
$request = $this->requestURL . "/file";
$session = $this->curlInit($request);
$args = array( 'file' => $file );
$postargs = json_encode($args);
$this->preparePOST($session, $postargs);
$response = trim(curl_exec($session));
return $this->extractValueFromJsonResponse($response);
}
更新:事实证明,您需要在$zip->addFile()方法上设置两个参数。已编辑上面的代码以反映这些更改。