将 jQuery 与 Selenium WebDriver 结合使用 - 如何将 JSON 对象转换为 WebEleme


Using jQuery with Selenium WebDriver - How to cast JSON Object to WebElement?

我正在使用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以单击按钮。

这样的事情呢? 这不是容易得多吗?

WebElement p =  (WebElement)((JavascriptExecutor)driver)
   .executeScript("return document.documentElement;");

在 PHP 中,这将是:

$element = (WebElement)$this->webdriver->executeScript("return document.documentElement;");

我认为你只需要在你的jquery语句中调用"get()"

return $('#itemlist .grant_file_upload:first').get();