tests: add click_element to quteprocess
This commit is contained in:
parent
f085eb6eca
commit
b6c5ff25fd
@ -37,6 +37,7 @@ from PyQt5.QtCore import pyqtSignal, QUrl
|
|||||||
import testprocess
|
import testprocess
|
||||||
from qutebrowser.misc import ipc
|
from qutebrowser.misc import ipc
|
||||||
from qutebrowser.utils import log, utils
|
from qutebrowser.utils import log, utils
|
||||||
|
from qutebrowser.browser import webelem
|
||||||
from helpers import utils as testutils
|
from helpers import utils as testutils
|
||||||
|
|
||||||
|
|
||||||
@ -253,9 +254,13 @@ class QuteProc(testprocess.Process):
|
|||||||
path if path != '/' else '')
|
path if path != '/' else '')
|
||||||
|
|
||||||
def wait_for_js(self, message):
|
def wait_for_js(self, message):
|
||||||
"""Wait for the given javascript console message."""
|
"""Wait for the given javascript console message.
|
||||||
self.wait_for(category='js', function='javaScriptConsoleMessage',
|
|
||||||
message='[*] {}'.format(message))
|
Return:
|
||||||
|
The LogLine.
|
||||||
|
"""
|
||||||
|
return self.wait_for(category='js', function='javaScriptConsoleMessage',
|
||||||
|
message='[*] {}'.format(message))
|
||||||
|
|
||||||
def _is_error_logline(self, msg):
|
def _is_error_logline(self, msg):
|
||||||
"""Check if the given LogLine is some kind of error message."""
|
"""Check if the given LogLine is some kind of error message."""
|
||||||
@ -422,6 +427,28 @@ class QuteProc(testprocess.Process):
|
|||||||
"""Press the given keys using :fake-key."""
|
"""Press the given keys using :fake-key."""
|
||||||
self.send_cmd(':fake-key -g "{}"'.format(keys))
|
self.send_cmd(':fake-key -g "{}"'.format(keys))
|
||||||
|
|
||||||
|
def click_element(self, text):
|
||||||
|
"""Click the element with the given text."""
|
||||||
|
# Use Javascript and XPath to find the right element, use console.log to
|
||||||
|
# return an error (no element found, ambiguous element)
|
||||||
|
script = (
|
||||||
|
'var _es = document.evaluate(\'//*[text()="{text}"]\', document, '
|
||||||
|
'null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);'
|
||||||
|
'if (_es.snapshotLength == 0) {{ console.log("qute:no elems"); }} '
|
||||||
|
'else if (_es.snapshotLength > 1) {{ console.log("qute:ambiguous '
|
||||||
|
'elems") }} '
|
||||||
|
'else {{ console.log("qute:okay"); _es.snapshotItem(0).click() }}'
|
||||||
|
).format(text=webelem.javascript_escape(text))
|
||||||
|
self.send_cmd(':jseval ' + script)
|
||||||
|
message = self.wait_for_js('qute:*').message
|
||||||
|
if message.endswith('qute:no elems'):
|
||||||
|
raise ValueError('No element with {!r} found'.format(text))
|
||||||
|
elif message.endswith('qute:ambiguous elems'):
|
||||||
|
raise ValueError('Element with {!r} is not unique'.format(text))
|
||||||
|
elif not message.endswith('qute:okay'):
|
||||||
|
raise ValueError('Invalid response from qutebrowser: {}'
|
||||||
|
.format(message))
|
||||||
|
|
||||||
|
|
||||||
@pytest.yield_fixture(scope='module')
|
@pytest.yield_fixture(scope='module')
|
||||||
def quteproc_process(qapp, httpbin, request):
|
def quteproc_process(qapp, httpbin, request):
|
||||||
|
@ -178,13 +178,7 @@ def test_enter_folder_smoke(dir_layout, quteproc):
|
|||||||
@pytest.mark.parametrize('folder', DirLayout.layout_folders())
|
@pytest.mark.parametrize('folder', DirLayout.layout_folders())
|
||||||
def test_enter_folder(dir_layout, quteproc, folder):
|
def test_enter_folder(dir_layout, quteproc, folder):
|
||||||
quteproc.open_url(dir_layout.file_url())
|
quteproc.open_url(dir_layout.file_url())
|
||||||
# Use Javascript and XPath to click the link that has the folder name as
|
quteproc.click_element(text=folder)
|
||||||
# text.
|
|
||||||
quteproc.send_cmd(
|
|
||||||
':jseval document.evaluate(\'//a[text()="{}"]\', document, null, '
|
|
||||||
'XPathResult.ANY_TYPE, null).iterateNext().click()'
|
|
||||||
.format(folder)
|
|
||||||
)
|
|
||||||
page = parse(quteproc)
|
page = parse(quteproc)
|
||||||
assert page.path == dir_layout.path(folder)
|
assert page.path == dir_layout.path(folder)
|
||||||
assert page.parent == dir_layout.path()
|
assert page.parent == dir_layout.path()
|
||||||
|
Loading…
Reference in New Issue
Block a user