зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
1101f31a9c
Коммит
0081a0eb3b
|
@ -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;
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче