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.

3
  • 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. Commented Dec 5, 2014 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 Commented Dec 5, 2014 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. Commented Jan 14, 2015 at 2:40

2 Answers 2

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;");
Sign up to request clarification or add additional context in comments.

3 Comments

You can't do that with PHP
Nah. I'm not a PHP programmer but I believe you can 'type cast' in PHP.
I tried to do this: $grantsDocsfileInput = (WebElement)$this->webdriver->executeScript('return $("#itemlist .grant_file_upload:first")', array()); But I get "Syntax error unexpected: variable $this"
0

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

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.