4

I'm using Selenium WebDriver and I'd like to execute jQuery code to find some elements.

My code is as follows:

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, ''); returns a WebElement JSON Object and I need to cast it to WebElement in order for the code to work, so I use typecast($grantsDocsfileInput, 'WebElement');

However, it's not casting correctly.

This is the expected var_dump result:

object(WebElement)#15 (2) {
  ["requestURL":protected]=>
  string(83) "http://localhost:4444/wd/hub/session/faadc168-4e8d-4fd5-b777-906885697030/element/6"
  ["_curl":protected]=>
  NULL
}

This is the result I get:

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
}

What am I doing wrong? Is this the correct approach to use jQuery with Selenium WebDriver? I can get attribute values but if executeScript finds an Object (e. g. a Button) it returns a stdClass and I can't convert it to WebElement in order to click the Button, for example.

ROMANIA_engineer
  • 54,432
  • 29
  • 203
  • 199
  • Why are you using a jQuery selector at all? All that is, is a CSS selector which can be done natively through Selenium saving you from the problems you've got. jQuery is just adding unnecessary complications here. – Arran Dec 05 '14 at 15:00
  • In some test cases jQuery would simplify the code a lot and be more efficient so the company for whom I'm working wants me to implement the hability to run tests using jQuery. I've searched beforehand so I know it's possible but unfortunately I'm having trouble converting the JSON Object to WebElement – Guilherme Castelo Dec 05 '14 at 15:17
  • Since this question is in some ways related to the PHP WebDriver binding implementation (i.e. different bindings could return a differing object structure), did you try asking or raising an issue at the PHP binding's project repo? The author(s) and/or user(s) there could better help you out. Also, what does the var dump look like without typecasting? For this particular case of your's it's much easier if you used a supported language like Java, the casting/conversion is better handled there. – David Jan 14 '15 at 02:40

2 Answers2

0

What about something like this instead? Wouldn't this be a lot easier?

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

In PHP, that would be:

$element = (WebElement)$this->webdriver->executeScript("return document.documentElement;");
djangofan
  • 28,471
  • 61
  • 196
  • 289
0

I think you just need to call "get()" in your jquery statement

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

Mariusz
  • 346
  • 3
  • 6