Bug 1558314 [wpt PR 17260] - Automate tap action on an element in an iframe, a=testonly

Automatic update from web-platform-tests
Automate tap action on an element in an iframe (#17260)

--

wpt-commits: a9d6d1b058f9d37cabaf735ea60f9b87acc8a02b
wpt-pr: 17260
This commit is contained in:
Lan Wei 2019-07-19 19:44:44 +00:00 коммит произвёл James Graham
Родитель 1101f31a9c
Коммит 0081a0eb3b
7 изменённых файлов: 64 добавлений и 13 удалений

Просмотреть файл

@ -218,7 +218,12 @@ class Actions(object):
``ActionSequence.dict``.
"""
body = {"actions": [] if actions is None else actions}
return self.session.send_session_command("POST", "actions", body)
actions = self.session.send_session_command("POST", "actions", body)
"""WebDriver window should be set to the top level window when wptrunner
processes the next event.
"""
self.session.switch_frame(None)
return actions
@command
def release(self):
@ -308,8 +313,11 @@ class Find(object):
self.session = session
@command
def css(self, selector, all=True):
return self._find_element("css selector", selector, all)
def css(self, element_selector, frame, all=True):
if (frame != "window"):
self.session.switch_frame(frame)
elements = self._find_element("css selector", element_selector, all)
return elements
def _find_element(self, strategy, selector, all):
route = "elements" if all else "element"

Просмотреть файл

@ -669,11 +669,11 @@ class ActionSequenceAction(object):
for action in actionSequence["actions"]:
if (action["type"] == "pointerMove" and
isinstance(action["origin"], dict)):
action["origin"] = self.get_element(action["origin"]["selector"])
action["origin"] = self.get_element(action["origin"]["selector"], action["frame"]["frame"])
self.protocol.action_sequence.send_actions({"actions": actions})
def get_element(self, selector):
element = self.protocol.select.element_by_selector(selector)
def get_element(self, element_selector, frame):
element = self.protocol.select.element_by_selector(element_selector, frame)
return element
class GenerateTestReportAction(object):

Просмотреть файл

@ -386,6 +386,9 @@ class MarionetteSelectorProtocolPart(SelectorProtocolPart):
def elements_by_selector(self, selector):
return self.marionette.find_elements("css selector", selector)
def elements_by_selector_and_frame(self, element_selector, frame):
return self.marionette.find_elements("css selector", element_selector)
class MarionetteClickProtocolPart(ClickProtocolPart):
def setup(self):

Просмотреть файл

@ -149,6 +149,9 @@ class SeleniumSelectorProtocolPart(SelectorProtocolPart):
def elements_by_selector(self, selector):
return self.webdriver.find_elements_by_css_selector(selector)
def elements_by_selector_and_frame(self, element_selector, frame):
return self.webdriver.find_elements_by_css_selector(element_selector)
class SeleniumClickProtocolPart(ClickProtocolPart):
def setup(self):

Просмотреть файл

@ -142,6 +142,9 @@ class WebDriverSelectorProtocolPart(SelectorProtocolPart):
def elements_by_selector(self, selector):
return self.webdriver.find.css(selector)
def elements_by_selector_and_frame(self, element_selector, frame):
return self.webdriver.find.css(element_selector, frame)
class WebDriverClickProtocolPart(ClickProtocolPart):
def setup(self):

Просмотреть файл

@ -235,12 +235,15 @@ class SelectorProtocolPart(ProtocolPart):
name = "select"
def element_by_selector(self, selector):
elements = self.elements_by_selector(selector)
def element_by_selector(self, element_selector, frame="window"):
elements = self.elements_by_selector_and_frame(element_selector, frame)
frame_name = "window"
if (frame != "window"):
frame_name = frame.id
if len(elements) == 0:
raise ValueError("Selector '%s' matches no elements" % selector)
raise ValueError("Selector '%s' in frame '%s' matches no elements" % (element_selector, frame_name))
elif len(elements) > 1:
raise ValueError("Selector '%s' matches multiple elements" % selector)
raise ValueError("Selector '%s' in frame '%s' matches multiple elements" % (element_selector, frame_name))
return elements[0]
@abstractmethod
@ -251,6 +254,13 @@ class SelectorProtocolPart(ProtocolPart):
:returns: A list of protocol-specific handles to elements"""
pass
@abstractmethod
def elements_by_selector_and_frame(self, element_selector, frame):
"""Select elements matching a CSS selector
:param str selector: The CSS selector
:returns: A list of protocol-specific handles to elements"""
pass
class ClickProtocolPart(ProtocolPart):
"""Protocol part for performing trusted clicks"""

Просмотреть файл

@ -21,10 +21,26 @@
}
});
const get_frame = function(element, frame) {
let foundFrame = frame;
let frameDocument = frame == window ? window.document : frame.contentDocument;
if (!frameDocument.contains(element)) {
foundFrame = null;
let frames = document.getElementsByTagName("iframe");
for (let i = 0; i < frames.length; i++) {
if (get_frame(element, frames[i])) {
foundFrame = frames[i];
break;
}
}
}
return foundFrame;
};
const get_selector = function(element) {
let selector;
if (element.id && document.getElementById(element.id) === element) {
if (element.id) {
const id = element.id;
selector = "#";
@ -81,12 +97,20 @@
for (let actionSequence of actions) {
if (actionSequence.type == "pointer") {
for (let action of actionSequence.actions) {
if (action.type == "pointerMove" && action.origin instanceof Element) {
// The origin of each action can only be an element or a string of a value "viewport" or "pointer".
if (action.type == "pointerMove" && typeof(action.origin) != 'string') {
let frame = get_frame(action.origin, window);
if (frame != null) {
if (frame == window)
action.frame = {frame: "window"};
else
action.frame = {frame: frame};
action.origin = {selector: get_selector(action.origin)};
}
}
}
}
}
window.__wptrunner_message_queue.push({"type": "action", "action": "action_sequence", "actions": actions});
return pending_promise;
};