【发布时间】:2015-02-03 14:46:29
【问题描述】:
我正在使用 Selenium WebDriver,我想执行 jQuery 代码来查找一些元素。
我的代码如下:
public function uploadGrantDoc() {
$script = "return $('#itemlist .grant_file_upload:first');";
$grantsDocsfileInput = $this->webdriver->executeScript($script, '');
$grantsDocsfileInputWebElement = $this->typecast($grantsDocsfileInput, 'WebElement');
var_dump($grantsDocsfileInputWebElement);
// Sets the Grants' Docs File Input value
$grantsDocsfileInputWebElement->sendKeys(array($this->grantsDocsFileDirectory));
// Submits the Form
$grantsDocsfileInputWebElement->submit();
// The success message must be present
$this->checkIfSuccessMessageIsPresent();
}
function typecast($old_object, $new_classname) {
if(class_exists($new_classname)) {
$old_serialized_object = serialize($old_object);
$new_serialized_object = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":' .
substr($old_serialized_object, $old_serialized_object[2] + 7);
return unserialize($new_serialized_object);
}
else
return false;
}
executeScript($script, '');返回一个 WebElement JSON 对象,我需要将其转换为 WebElement 才能使代码正常工作,因此我使用 typecast($grantsDocsfileInput, 'WebElement');
但是,它没有正确投射。
这是预期的 var_dump 结果:
object(WebElement)#15 (2) {
["requestURL":protected]=>
string(83) "http://localhost:4444/wd/hub/session/faadc168-4e8d-4fd5-b777-906885697030/element/6"
["_curl":protected]=>
NULL
}
这是我得到的结果:
object(WebElement)#13 (9) {
["requestURL":protected]=>
NULL
["_curl":protected]=>
NULL
["message"]=>
string(49) "java.lang.String cannot be cast to java.util.List"
["localizedMessage"]=>
string(49) "java.lang.String cannot be cast to java.util.List"
["cause"]=>
NULL
["class"]=>
string(28) "java.lang.ClassCastException"
["hCode"]=>
int(1535747955)
["stackTrace"]=>
array(20) {
[0]=>
object(stdClass)#35 (7) {
["fileName"]=>
string(18) "ExecuteScript.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(43)
["className"]=>
string(55) "org.openqa.selenium.remote.server.handler.ExecuteScript"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(17) "setJsonParameters"
["hCode"]=>
int(804634460)
}
[1]=>
object(stdClass)#36 (7) {
["fileName"]=>
string(17) "ResultConfig.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(100)
["className"]=>
string(51) "org.openqa.selenium.remote.server.rest.ResultConfig"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(6) "handle"
["hCode"]=>
int(517694315)
}
[2]=>
object(stdClass)#37 (7) {
["fileName"]=>
string(27) "JsonHttpCommandHandler.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(172)
["className"]=>
string(56) "org.openqa.selenium.remote.server.JsonHttpCommandHandler"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(13) "handleRequest"
["hCode"]=>
int(-924916998)
}
[3]=>
object(stdClass)#38 (7) {
["fileName"]=>
string(18) "DriverServlet.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(201)
["className"]=>
string(47) "org.openqa.selenium.remote.server.DriverServlet"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(13) "handleRequest"
["hCode"]=>
int(-473869175)
}
[4]=>
object(stdClass)#39 (7) {
["fileName"]=>
string(18) "DriverServlet.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(163)
["className"]=>
string(47) "org.openqa.selenium.remote.server.DriverServlet"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(6) "doPost"
["hCode"]=>
int(-1874935833)
}
[5]=>
object(stdClass)#40 (7) {
["fileName"]=>
string(16) "HttpServlet.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(727)
["className"]=>
string(30) "javax.servlet.http.HttpServlet"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(7) "service"
["hCode"]=>
int(1081440705)
}
[6]=>
object(stdClass)#41 (7) {
["fileName"]=>
string(18) "DriverServlet.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(129)
["className"]=>
string(47) "org.openqa.selenium.remote.server.DriverServlet"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(7) "service"
["hCode"]=>
int(1913428015)
}
[7]=>
object(stdClass)#42 (7) {
["fileName"]=>
string(16) "HttpServlet.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(820)
["className"]=>
string(30) "javax.servlet.http.HttpServlet"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(7) "service"
["hCode"]=>
int(1081440798)
}
[8]=>
object(stdClass)#43 (7) {
["fileName"]=>
string(18) "ServletHolder.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(428)
["className"]=>
string(44) "org.openqa.jetty.jetty.servlet.ServletHolder"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(6) "handle"
["hCode"]=>
int(1066597463)
}
[9]=>
object(stdClass)#44 (7) {
["fileName"]=>
string(19) "ServletHandler.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(680)
["className"]=>
string(45) "org.openqa.jetty.jetty.servlet.ServletHandler"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(8) "dispatch"
["hCode"]=>
int(1390736799)
}
[10]=>
object(stdClass)#45 (7) {
["fileName"]=>
string(19) "ServletHandler.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(571)
["className"]=>
string(45) "org.openqa.jetty.jetty.servlet.ServletHandler"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(6) "handle"
["hCode"]=>
int(-1689621664)
}
[11]=>
object(stdClass)#46 (7) {
["fileName"]=>
string(16) "HttpContext.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(1526)
["className"]=>
string(33) "org.openqa.jetty.http.HttpContext"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(6) "handle"
["hCode"]=>
int(1685351418)
}
[12]=>
object(stdClass)#47 (7) {
["fileName"]=>
string(16) "HttpContext.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(1479)
["className"]=>
string(33) "org.openqa.jetty.http.HttpContext"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(6) "handle"
["hCode"]=>
int(1685351371)
}
[13]=>
object(stdClass)#48 (7) {
["fileName"]=>
string(15) "HttpServer.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(920)
["className"]=>
string(32) "org.openqa.jetty.http.HttpServer"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(7) "service"
["hCode"]=>
int(1779095633)
}
[14]=>
object(stdClass)#49 (7) {
["fileName"]=>
string(19) "HttpConnection.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(820)
["className"]=>
string(36) "org.openqa.jetty.http.HttpConnection"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(7) "service"
["hCode"]=>
int(-1150970931)
}
[15]=>
object(stdClass)#50 (7) {
["fileName"]=>
string(19) "HttpConnection.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(986)
["className"]=>
string(36) "org.openqa.jetty.http.HttpConnection"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(10) "handleNext"
["hCode"]=>
int(1892375929)
}
[16]=>
object(stdClass)#51 (7) {
["fileName"]=>
string(19) "HttpConnection.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(837)
["className"]=>
string(36) "org.openqa.jetty.http.HttpConnection"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(6) "handle"
["hCode"]=>
int(-954717551)
}
[17]=>
object(stdClass)#52 (7) {
["fileName"]=>
string(19) "SocketListener.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(243)
["className"]=>
string(36) "org.openqa.jetty.http.SocketListener"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(16) "handleConnection"
["hCode"]=>
int(91812189)
}
[18]=>
object(stdClass)#53 (7) {
["fileName"]=>
string(19) "ThreadedServer.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(358)
["className"]=>
string(36) "org.openqa.jetty.util.ThreadedServer"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(6) "handle"
["hCode"]=>
int(-1347859604)
}
[19]=>
object(stdClass)#54 (7) {
["fileName"]=>
string(15) "ThreadPool.java"
["class"]=>
string(27) "java.lang.StackTraceElement"
["lineNumber"]=>
int(537)
["className"]=>
string(43) "org.openqa.jetty.util.ThreadPool$PoolThread"
["nativeMethod"]=>
bool(false)
["methodName"]=>
string(3) "run"
["hCode"]=>
int(172881960)
}
}
["screen"]=>
NULL
}
我做错了什么?这是将 jQuery 与 Selenium WebDriver 一起使用的正确方法吗? 我可以获取属性值,但如果 executeScript 找到一个对象(例如按钮),它会返回一个 stdClass,并且我无法将其转换为 WebElement 以单击按钮。
【问题讨论】:
-
你为什么要使用 jQuery 选择器?这就是一个 CSS 选择器,它可以通过 Selenium 本地完成,从而使您免于遇到的问题。 jQuery 只是在这里增加了不必要的复杂性。
-
在某些测试用例中,jQuery 会大大简化代码并提高效率,因此我工作的公司希望我实现使用 jQuery 运行测试的能力。我事先搜索过,所以我知道这是可能的,但不幸的是我无法将 JSON 对象转换为 WebElement
-
由于这个问题在某些方面与 PHP WebDriver 绑定实现有关(即不同的绑定可能返回不同的对象结构),您是否尝试在 PHP 绑定的项目 repo 中提出问题?那里的作者和/或用户可以更好地帮助你。另外,没有类型转换的 var 转储是什么样的?对于您的这种特殊情况,如果您使用受支持的语言(如 Java)会容易得多,在那里可以更好地处理转换/转换。
标签: php jquery json selenium webdriver