Skip to content

Commit 4de0b1d

Browse files
authored
Bc/Add find in PDF test (#84)
* add test and some helpers * unused dep * comment on custom wait event
1 parent d262b0e commit 4de0b1d

File tree

8 files changed

+125
-3
lines changed

8 files changed

+125
-3
lines changed

conftest.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,8 @@ def version(driver: webdriver.Firefox):
214214
@pytest.fixture(scope="session", autouse=True)
215215
def faker_seed():
216216
return 19980331
217+
218+
219+
@pytest.fixture(scope="session")
220+
def fillable_pdf_url():
221+
return "https://www.uscis.gov/sites/default/files/document/forms/i-9.pdf"

modules/browser_object_find_toolbar.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ def open(self) -> BasePage:
2020
self.wait_for_page_to_load()
2121
return self
2222

23+
def open_with_key_combo(self) -> BasePage:
24+
"""Use Cmd/Ctrl + F to open the Find Toolbar, wait for load"""
25+
with self.driver.context(self.driver.CONTEXT_CHROME):
26+
if self.sys_platform() == "Darwin":
27+
mod_key = Keys.COMMAND
28+
else:
29+
mod_key = Keys.CONTROL
30+
self.perform_key_combo(mod_key, "f")
31+
self.wait_for_page_to_load()
32+
return self
33+
2334
def find(self, term: str) -> BasePage:
2435
"""Use the Find Toolbar to search"""
2536
with self.driver.context(self.driver.CONTEXT_CHROME):
@@ -46,8 +57,33 @@ def next_match(self) -> BasePage:
4657
"""Click the Next Match button"""
4758
with self.driver.context(self.driver.CONTEXT_CHROME):
4859
self.get_element("next-match-button").click()
60+
return self
4961

5062
def previous_match(self) -> BasePage:
5163
"""Click the Previous Match button"""
5264
with self.driver.context(self.driver.CONTEXT_CHROME):
5365
self.get_element("previous-match-button").click()
66+
return self
67+
68+
def rewind_to_first_match(self) -> BasePage:
69+
"""Go back to match 1 of n"""
70+
with self.driver.context(self.driver.CONTEXT_CHROME):
71+
position = self.get_match_args()["current"]
72+
total = self.get_match_args()["total"]
73+
while position != 1:
74+
if position < total // 2:
75+
self.previous_match()
76+
else:
77+
self.next_match()
78+
position = self.get_match_args()["current"]
79+
return self
80+
81+
def navigate_matches_by_keys(self, backwards=False) -> BasePage:
82+
"""Use F3 and Shift+F3 to navigate matches"""
83+
with self.driver.context(self.driver.CONTEXT_CHROME):
84+
if backwards:
85+
self.perform_key_combo(Keys.SHIFT, Keys.F3)
86+
else:
87+
logging.info(f"sending {Keys.F3.encode()}")
88+
self.actions.send_keys(Keys.F3).perform()
89+
return self
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"text-layer": {
3+
"selectorData": "textLayer",
4+
"strategy": "class",
5+
"groups": [
6+
"requiredForPage"
7+
]
8+
},
9+
10+
"highlighted-text": {
11+
"selectorData": ".textLayer .highlight.selected.appended",
12+
"strategy": "css",
13+
"groups": [
14+
"doNotCache"
15+
]
16+
}
17+
}

modules/page_base.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,14 @@ def get_elements(self, name: str, labels=[]):
306306
"""
307307
return self.get_element(name, multiple=True, labels=labels)
308308

309+
def get_parent_of(self, name: str, labels=[]) -> WebElement:
310+
"""
311+
Given a name (and labels if needed), return the direct parent node of the element.
312+
"""
313+
314+
child = self.get_element(name, labels=labels)
315+
return child.find_element(By.XPATH, "..")
316+
309317
def element_exists(self, name: str, labels=[]) -> Page:
310318
"""Expect helper: wait until element exists or timeout"""
311319
self.expect(

modules/page_object.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
from modules.page_object_autofill_credit_card import *
1010
from modules.page_object_autofill_test_basic import *
1111
from modules.page_object_example_page import *
12+
from modules.page_object_generic_pdf import *
1213
from modules.page_object_google_search import *
1314
from modules.page_object_wiki_firefox_logo import *

modules/page_object_generic_pdf.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from modules.page_base import BasePage
2+
3+
4+
class GenericPdf(BasePage):
5+
"""
6+
Generic POM for any page with an open PDF in it.
7+
"""
8+
9+
URL_TEMPLATE = "{pdf_url}"
10+
11+
def get_green_highlighted_text(self) -> str:
12+
return self.get_element("highlighted-text").get_attribute("innerText")
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import logging
2+
from time import sleep
3+
4+
from selenium.webdriver import Firefox
5+
from selenium.webdriver.common.keys import Keys
6+
7+
from modules.browser_object import FindToolbar
8+
from modules.page_base import BasePage
9+
from modules.page_object import GenericPdf
10+
11+
WORD_SEGMENT = "authori"
12+
MATCH_TWO_COTEXT = "representative must complete"
13+
14+
15+
class element_parent_has_text:
16+
"""
17+
Custom WebDriverWait event:
18+
if an element's parent node contains certain text, return the element (not the parent)"""
19+
20+
def __init__(self, pom: BasePage, name: str, text: str):
21+
self.name = name
22+
self.pom = pom
23+
self.text = text
24+
25+
def __call__(self, driver: Firefox):
26+
child = self.pom.get_element(self.name)
27+
parent = self.pom.get_parent_of(self.name)
28+
if self.text in parent.text:
29+
return child
30+
else:
31+
return False
32+
33+
34+
def test_find_in_pdf_using_key_combos(driver: Firefox, fillable_pdf_url: str):
35+
"""
36+
C127271: Search on a PDF page
37+
"""
38+
pdf = GenericPdf(driver, pdf_url=fillable_pdf_url).open()
39+
find_toolbar = FindToolbar(driver).open_with_key_combo()
40+
find_toolbar.find(WORD_SEGMENT)
41+
assert pdf.get_green_highlighted_text() == WORD_SEGMENT
42+
43+
find_toolbar.rewind_to_first_match()
44+
find_toolbar.navigate_matches_by_keys()
45+
pdf.expect(element_parent_has_text(pdf, "highlighted-text", MATCH_TWO_COTEXT))

tests/find_toolbar/test_find_toolbar_nav.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ def test_find_toolbar_navigation(driver: Firefox):
2828

2929
# Sometimes we get a match that isn't the first
3030
# (This also tests that the number is correct)
31-
while match_status["current"] != 1:
32-
find_toolbar.previous_match()
33-
match_status = find_toolbar.get_match_args()
31+
find_toolbar.rewind_to_first_match()
3432

3533
# Ensure that first match is highlighted, others are not
3634
processes_selector = (By.CSS_SELECTOR, "a[href='about:processes']")

0 commit comments

Comments
 (0)