73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
import os
|
|
|
|
from selenium.webdriver.common.by import By
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
|
|
from notebook.utils import url_path_join
|
|
from notebook.tests.selenium.utils import wait_for_selector
|
|
pjoin = os.path.join
|
|
|
|
|
|
class PageError(Exception):
|
|
"""Error for an action being incompatible with the current jupyter web page.
|
|
|
|
"""
|
|
def __init__(self, message):
|
|
self.message = message
|
|
|
|
|
|
def url_in_tree(browser, url=None):
|
|
if url is None:
|
|
url = browser.current_url
|
|
tree_url = url_path_join(browser.jupyter_server_info['url'], 'tree')
|
|
return url.startswith(tree_url)
|
|
|
|
|
|
def get_list_items(browser):
|
|
"""Gets list items from a directory listing page
|
|
|
|
Raises PageError if not in directory listing page (url has tree in it)
|
|
"""
|
|
if not url_in_tree(browser):
|
|
raise PageError("You are not in the notebook's file tree view."
|
|
"This function can only be used the file tree context.")
|
|
# we need to make sure that at least one item link loads
|
|
wait_for_selector(browser, '.item_link')
|
|
|
|
return [{
|
|
'link': a.get_attribute('href'),
|
|
'label': a.find_element_by_class_name('item_name').text,
|
|
'element': a,
|
|
} for a in browser.find_elements_by_class_name('item_link')]
|
|
|
|
def only_dir_links(browser):
|
|
"""Return only links that point at other directories in the tree
|
|
|
|
"""
|
|
items = get_list_items(browser)
|
|
return [i for i in items
|
|
if url_in_tree(browser, i['link']) and i['label'] != '..']
|
|
|
|
def test_items(authenticated_browser):
|
|
visited_dict = {}
|
|
# Going down the tree to collect links
|
|
while True:
|
|
wait_for_selector(authenticated_browser, '.item_link')
|
|
current_url = authenticated_browser.current_url
|
|
items = visited_dict[current_url] = only_dir_links(authenticated_browser)
|
|
try:
|
|
item = items[0]
|
|
item["element"].click()
|
|
assert authenticated_browser.current_url == item['link']
|
|
except IndexError:
|
|
break
|
|
# Going back up the tree while we still have unvisited links
|
|
while visited_dict:
|
|
current_items = only_dir_links(authenticated_browser)
|
|
current_items_links = [item["link"] for item in current_items]
|
|
stored_items = visited_dict.pop(authenticated_browser.current_url)
|
|
stored_items_links = [item["link"] for item in stored_items]
|
|
assert stored_items_links == current_items_links
|
|
authenticated_browser.back()
|
|
|