【问题标题】:Using jQuery with Selenium WebDriver - How to cast JSON Object to WebElement?将 jQuery 与 Selenium WebDriver 一起使用 - 如何将 JSON 对象转换为 WebElement?
【发布时间】: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


【解决方案1】:

这样的东西呢?这会不会容易很多?

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

在 PHP 中,应该是:

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

【讨论】:

  • PHP 无法做到这一点
  • 不。我不是 PHP 程序员,但我相信你可以在 PHP 中进行“类型转换”。
  • 我尝试这样做:$grantsDocsfileInput = (WebElement)$this->webdriver->executeScript('return $("#itemlist .grant_file_upload:first")', array()); 但我得到“语法错误意外:变量 $this”
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2020-03-14
    相关资源
    最近更新 更多