Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(504)

Side by Side Diff: chrome/test/webdriver/commands/find_element_commands.cc

Issue 3643002: Implemnts the commands in webdriver to preform searching of elements on a page. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: fix for windows build Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/test/webdriver/commands/find_element_commands.h"
6
7 #include <sstream>
8 #include <string>
9
10 #include "base/string_number_conversions.h"
11 #include "base/utf_string_conversions.h"
12 #include "base/values.h"
13 #include "third_party/webdriver/atoms.h"
14 #include "chrome/test/webdriver/error_codes.h"
15 #include "chrome/test/webdriver/utility_functions.h"
16
17 namespace webdriver {
18
19 bool FindElementCommand::Init(Response* const response) {
20 if (!WebDriverCommand::Init(response)) {
21 SET_WEBDRIVER_ERROR(response, "Failure on Init for find element",
22 kInternalServerError);
23 return false;
24 }
25
26 if (!GetStringASCIIParameter("using", &use_) ||
27 !GetStringASCIIParameter("value", &value_)) {
28 SET_WEBDRIVER_ERROR(response,
29 "Request is missing required 'using' and/or 'value' data", kBadRequest);
30 return false;
31 }
32
33 // TODO(jmikhail): The findElement(s) atom should handle this conversion.
34 if ("class name" == use_) {
35 use_ = "className";
36 } else if ("link text" == use_) {
37 use_ = "linkText";
38 } else if ("partial link text" == use_) {
39 use_ = "partialLinkText";
40 } else if ("tag name" == use_) {
41 use_ = "tagName";
42 }
43
44 // Searching under a custom root if the URL pattern is
45 // "/session/$session/element/$id/element(s)"
46 root_element_id_ = GetPathVariable(4);
47
48 return true;
49 }
50
51 void FindElementCommand::ExecutePost(Response* const response) {
52 scoped_ptr<ListValue> args(new ListValue());
53 DictionaryValue* locator = new DictionaryValue();
54 ErrorCode error;
55 std::wstring jscript;
56 Value* result = NULL;
57 bool done = false;
58
59 // Set the command we are using to locate the value beging searched for.
60 locator->SetString(use_, value_);
61 args->Append(locator);
62 args->Append(root_element_id_.size() == 0 ? Value::CreateNullValue() :
63 WebDriverCommand::GetElementIdAsDictionaryValue(root_element_id_));
64 if (find_one_element_) {
65 jscript = build_atom(FIND_ELEMENT, sizeof FIND_ELEMENT);
66 jscript.append(L"var result = findElement(arguments[0], arguments[1]);")
67 .append(L"if (!result) {")
68 .append(L"var e = Error('Unable to locate element');")
69 .append(L"e.code = ")
70 .append(UTF8ToWide(base::IntToString(kNoSuchElement)))
71 .append(L";throw e;")
72 .append(L"} else { return result; }");
73 } else {
74 jscript = build_atom(FIND_ELEMENTS, sizeof FIND_ELEMENT);
75 jscript.append(L"return findElements(arguments[0], arguments[1]);");
76 }
77
78 // The element search needs to loop until at least one element is found or the
79 // session's implicit wait timeout expires, whichever occurs first.
80 base::Time start_time = base::Time::Now();
81
82 while (!done) {
83 if (result) {
84 delete result;
85 result = NULL;
86 }
87
88 error = session_->ExecuteScript(jscript, args.get(), &result);
89 if (error == kSuccess) {
90 // If searching for many elements, make sure we found at least one before
91 // stopping.
92 done = find_one_element_ ||
93 (result->GetType() == Value::TYPE_LIST &&
94 static_cast<ListValue*>(result)->GetSize() > 0);
95 } else if (error != kNoSuchElement) {
96 SET_WEBDRIVER_ERROR(response, "Internal error in find_element atom",
97 kInternalServerError);
98 return;
99 }
100
101 int64 elapsed_time = (base::Time::Now() - start_time).InMilliseconds();
102 done = done || elapsed_time > session_->implicit_wait();
103 PlatformThread::Sleep(50); // Prevent a busy loop that eats the cpu.
104 }
105
106 response->set_value(result);
107 response->set_status(error);
108 }
109
110 } // namespace webdriver
111
OLDNEW
« no previous file with comments | « chrome/test/webdriver/commands/find_element_commands.h ('k') | chrome/test/webdriver/commands/implicit_wait_command.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698