Skip to content

Commit 7517728

Browse files
authored
Hot fix get text and get value under iframe element (#61)
* Update default click and type for support iframe * Update select and evaluate to support iframe * Fix get value and get text * Fix dropdown
1 parent 85e3463 commit 7517728

File tree

8 files changed

+136
-58
lines changed

8 files changed

+136
-58
lines changed

Examples/form-handler/dropdown-list.robot

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ Suite Teardown Close Puppeteer
66

77
*** Variables ***
88
${DEFAULT_BROWSER} chrome
9-
# ${DEFAULT_BROWSER} webkit
109
${HOME_PAGE_URL} http://127.0.0.1:7272/basic-html-elements.html
1110

1211

Examples/form-handler/iframe.robot

+15
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@ Interact with iframe element
2121
Unselect Frame
2222
Wait Until Page Contains Element id=ifrm
2323

24+
Get text under iframe element
25+
Wait Until Page Contains Element id=ifrm
26+
Select Frame id=ifrm
27+
${label text} = Get Text css=h2
28+
Should Be Equal As Strings Login form ${label text}
29+
${label text} = Get Text xpath=//h2
30+
Should Be Equal As Strings Login form ${label text}
31+
32+
Get value under iframe element
33+
Wait Until Page Contains Element id=ifrm
34+
Select Frame id=ifrm
35+
Input Text id=exampleInputEmail1 demo@qahive.com
36+
${email value} = Get Value id=exampleInputEmail1
37+
Should Be Equal As Strings demo@qahive.com ${email value}
38+
2439
*** Keywords ***
2540
Open browser to test page
2641
${BROWSER} = Get variable value ${BROWSER} ${DEFAULT_BROWSER}

PuppeteerLibrary/custom_elements/base_page.py

+17-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ class BasePage(ABC):
77
def get_page(self) -> any:
88
pass
99

10+
@abstractmethod
11+
def get_selected_frame_or_page(self) -> any:
12+
pass
13+
1014
@abstractmethod
1115
async def goto(self, url: str):
1216
pass
@@ -52,15 +56,25 @@ async def waitForSelector_with_selenium_locator(self, selenium_locator: str, tim
5256
# Query
5357
##############################
5458
@abstractmethod
55-
async def querySelector(self, selector: str):
59+
async def querySelectorAll_with_selenium_locator(self, selenium_locator: str):
5660
pass
5761

5862
@abstractmethod
59-
async def querySelectorAll_with_selenium_locator(self, selenium_locator: str):
63+
async def querySelector_with_selenium_locator(self, selenium_locator: str):
64+
pass
65+
66+
############
67+
# Select
68+
############
69+
@abstractmethod
70+
async def select_with_selenium_locator(self, selenium_locator: str, values: str):
6071
pass
6172

73+
############
74+
# Evaluate
75+
############
6276
@abstractmethod
63-
async def querySelector_with_selenium_locator(self, selenium_locator: str):
77+
async def evaluate_with_selenium_locator(self, evaluate: str):
6478
pass
6579

6680
##############################

PuppeteerLibrary/keywords/element.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def get_value(self, locator):
139139
140140
| ${value} | `Get Value` | id:comment |
141141
"""
142-
return self.loop.run_until_complete(self.get_async_keyword_group().get_text(locator))
142+
return self.loop.run_until_complete(self.get_async_keyword_group().get_attribute(locator, "value"))
143143

144144
@keyword
145145
def get_element_attribute(self, locator, attribute):

PuppeteerLibrary/playwright/async_keywords/playwright_dropdown.py

+3-15
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,16 @@ def __init__(self, library_ctx):
99

1010
async def select_from_list_by_value(self, locator, values):
1111
selector_value = SelectorAbstraction.get_selector(locator)
12-
if SelectorAbstraction.is_xpath(locator):
13-
await self.library_ctx.get_current_page().get_page().evaluate('''
14-
element = document.evaluate('{selector_value}//option[contains(@value, "{values}")]', document, null, XPathResult.ANY_TYPE, null).iterateNext();
15-
element.selected = true;
16-
'''.format(selector_value=selector_value, values=values))
17-
else:
18-
await self.library_ctx.get_current_page().get_page().selectOption(selector_value, {
12+
return await self.library_ctx.get_current_page().get_selected_frame_or_page().selectOption(selector_value, {
1913
'value': values
2014
})
2115

2216
async def select_from_list_by_label(self, locator, labels):
2317
selector_value = SelectorAbstraction.get_selector(locator)
24-
if SelectorAbstraction.is_xpath(locator):
25-
await self.library_ctx.get_current_page().get_page().evaluate('''
26-
element = document.evaluate('{selector_value}//option[text()=\"{label}\"]', document, null, XPathResult.ANY_TYPE, null).iterateNext();
27-
element.selected = true;
28-
'''.format(selector_value=selector_value, label=labels))
29-
else:
30-
await self.library_ctx.get_current_page().get_page().selectOption(selector_value, {
18+
return await self.library_ctx.get_current_page().get_selected_frame_or_page().selectOption(selector_value, {
3119
'label': labels
3220
})
33-
21+
3422
async def get_selected_list_labels(self, locator: str) -> str:
3523
element = await self.library_ctx.get_current_page().querySelector_with_selenium_locator(locator)
3624
options = await element.querySelectorAll('option:checked')

PuppeteerLibrary/playwright/custom_elements/playwright_page.py

+29-8
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,23 @@ def __init__(self, page: Page):
1515

1616
def get_page(self) -> Page:
1717
return self.page
18+
19+
def get_selected_frame_or_page(self):
20+
if self.selected_iframe is not None:
21+
return self.selected_iframe
22+
else:
23+
return self.page
1824

1925
async def goto(self, url: str):
26+
self.unselect_iframe()
2027
return await self.page.goto(url)
2128

2229
async def go_back(self):
30+
self.unselect_iframe()
2331
return await self.page.goBack()
2432

2533
async def reload_page(self):
34+
self.unselect_iframe()
2635
return await self.page.reload()
2736

2837
async def title(self):
@@ -77,19 +86,31 @@ async def waitForSelector_with_selenium_locator(self, selenium_locator: str, tim
7786
############
7887
# Query
7988
############
80-
async def querySelector(self, selector: str):
81-
if self.selected_iframe is not None:
82-
return await self.selected_iframe.querySelector(selector=selector)
83-
else:
84-
return await self.get_page().querySelector(selector=selector)
85-
8689
async def querySelectorAll_with_selenium_locator(self, selenium_locator: str):
8790
selector_value = SelectorAbstraction.get_selector(selenium_locator)
88-
return await self.get_page().querySelectorAll(selector_value)
91+
if self.selected_iframe is not None:
92+
return await self.selected_iframe.querySelectorAll(selector_value)
93+
else:
94+
return await self.get_page().querySelectorAll(selector_value)
8995

9096
async def querySelector_with_selenium_locator(self, selenium_locator: str):
9197
selector_value = SelectorAbstraction.get_selector(selenium_locator)
92-
return await self.get_page().querySelector(selector_value)
98+
if self.selected_iframe is not None:
99+
return await self.selected_iframe.querySelector(selector_value)
100+
else:
101+
return await self.get_page().querySelector(selector_value)
102+
103+
############
104+
# Select
105+
############
106+
async def select_with_selenium_locator(self, selenium_locator: str, values: str):
107+
raise Exception('Not implemented')
108+
109+
############
110+
# Evaluate
111+
############
112+
async def evaluate_with_selenium_locator(self, evaluate: str):
113+
return await self.get_selected_frame_or_page().evaluate(evaluate)
93114

94115
##############################
95116
# iframe

PuppeteerLibrary/puppeteer/async_keywords/puppeteer_dropdown.py

+7-12
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,23 @@ def __init__(self, library_ctx):
88
super().__init__(library_ctx)
99

1010
async def select_from_list_by_value(self, locator, values):
11-
selector_value = SelectorAbstraction.get_selector(locator)
12-
if SelectorAbstraction.is_xpath(locator):
13-
await self.library_ctx.get_current_page().get_page().evaluate('''
14-
element = document.evaluate('{selector_value}//option[contains(@value, "{values}")]', document, null, XPathResult.ANY_TYPE, null).iterateNext();
15-
element.selected = true;
16-
'''.format(selector_value=selector_value, values=values))
17-
else:
18-
await self.library_ctx.get_current_page().get_page().select(selector_value, values)
11+
await self.library_ctx.get_current_page().select_with_selenium_locator(locator, values)
1912

2013
async def select_from_list_by_label(self, locator, labels):
14+
evaluate = ''
2115
selector_value = SelectorAbstraction.get_selector(locator)
2216
if SelectorAbstraction.is_xpath(locator):
23-
await self.library_ctx.get_current_page().get_page().evaluate('''
17+
evaluate = '''
2418
element = document.evaluate('{selector_value}//option[text()=\"{label}\"]', document, null, XPathResult.ANY_TYPE, null).iterateNext();
2519
element.selected = true;
26-
'''.format(selector_value=selector_value, label=labels))
20+
'''.format(selector_value=selector_value, label=labels)
2721
else:
28-
await self.library_ctx.get_current_page().get_page().evaluate('''
22+
evaluate = '''
2923
selector_element = document.querySelector('{selector_value}');
3024
element = document.evaluate('//option[text()=\"{label}\"]', selector_element, null, XPathResult.ANY_TYPE, null).iterateNext();
3125
element.selected = true;
32-
'''.format(selector_value=selector_value, label=labels))
26+
'''.format(selector_value=selector_value, label=labels)
27+
return await self.library_ctx.get_current_page().evaluate_with_selenium_locator(evaluate)
3328

3429
async def get_selected_list_labels(self, locator: str) -> str:
3530
element = await self.library_ctx.get_current_page().querySelector_with_selenium_locator(locator)

PuppeteerLibrary/puppeteer/custom_elements/puppeteer_page.py

+64-18
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,22 @@ def __init__(self, page: Page):
1313
def get_page(self) -> Page:
1414
return self.page
1515

16+
def get_selected_frame_or_page(self):
17+
if self.selected_iframe is not None:
18+
return self.selected_iframe
19+
else:
20+
return self.page
21+
1622
async def goto(self, url: str):
23+
self.unselect_iframe()
1724
return await self.page.goto(url)
1825

1926
async def go_back(self):
27+
self.unselect_iframe()
2028
return await self.page.goBack()
2129

2230
async def reload_page(self):
31+
self.unselect_iframe()
2332
return await self.page.reload()
2433

2534
async def title(self):
@@ -37,17 +46,17 @@ async def set_viewport_size(self, width: int, height: int):
3746
async def click_with_selenium_locator(self, selenium_locator: str, options: dict = None, **kwargs: Any):
3847
selector_value = SelectorAbstraction.get_selector(selenium_locator)
3948
if SelectorAbstraction.is_xpath(selenium_locator):
40-
await self.click_xpath(selector_value, options, **kwargs)
49+
await self._click_xpath(selector_value, options, **kwargs)
4150
else:
42-
await self.click(selector_value, options, **kwargs)
51+
await self._click(selector_value, options, **kwargs)
4352

44-
async def click(self, selector: str, options: dict = None, **kwargs: Any):
53+
async def _click(self, selector: str, options: dict = None, **kwargs: Any):
4554
if self.selected_iframe is not None:
4655
return await self.selected_iframe.click(selector=selector, options=options, kwargs=kwargs)
4756
else:
4857
return await self.page.click(selector=selector, options=options, kwargs=kwargs)
4958

50-
async def click_xpath(self, selector: str, options: dict = None, **kwargs: Any):
59+
async def _click_xpath(self, selector: str, options: dict = None, **kwargs: Any):
5160
if self.selected_iframe is not None:
5261
elements = await self.selected_iframe.xpath(selector)
5362
return await elements[0].click(options, **kwargs)
@@ -61,17 +70,17 @@ async def click_xpath(self, selector: str, options: dict = None, **kwargs: Any):
6170
async def type_with_selenium_locator(self, selenium_locator: str, text: str, options: dict = None, **kwargs: Any):
6271
selector_value = SelectorAbstraction.get_selector(selenium_locator)
6372
if SelectorAbstraction.is_xpath(selenium_locator):
64-
await self.type_xpath(selector=selector_value, text=text, options=options, kwargs=kwargs)
73+
await self._type_xpath(selector=selector_value, text=text, options=options, kwargs=kwargs)
6574
else:
66-
await self.type(selector=selector_value, text=text, options=options, kwargs=kwargs)
75+
await self._type(selector=selector_value, text=text, options=options, kwargs=kwargs)
6776

68-
async def type(self, selector, text: str, options: dict = None, **kwargs: Any):
77+
async def _type(self, selector, text: str, options: dict = None, **kwargs: Any):
6978
if self.selected_iframe is not None:
7079
return await self.selected_iframe.type(selector=selector, text=text, options=options, kwargs=kwargs)
7180
else:
7281
return await self.page.type(selector=selector, text=text, options=options, kwargs=kwargs)
7382

74-
async def type_xpath(self, selector, text: str, options: dict = None, **kwargs: Any):
83+
async def _type_xpath(self, selector, text: str, options: dict = None, **kwargs: Any):
7584
if self.selected_iframe is not None:
7685
elements = await self.selected_iframe.xpath(selector)
7786
await elements[0].type(text, options, **kwargs)
@@ -109,25 +118,62 @@ async def _waitForXPath(self, xpath: str, options: dict = None):
109118
############
110119
# Query
111120
############
112-
async def querySelector(self, selector: str):
113-
if self.selected_iframe is not None:
114-
return await self.selected_iframe.querySelector(selector=selector)
115-
else:
116-
return await self.page.querySelector(selector=selector)
117-
118121
async def querySelectorAll_with_selenium_locator(self, selenium_locator: str):
119122
selector_value = SelectorAbstraction.get_selector(selenium_locator)
120123
if SelectorAbstraction.is_xpath(selenium_locator):
121-
return await self.page.xpath(selector_value)
124+
return await self._querySelectorAllForXpath(selector_value)
122125
else:
123-
return await self.page.querySelectorAll(selector_value)
126+
return await self._querySelectorAll(selector_value)
124127

125128
async def querySelector_with_selenium_locator(self, selenium_locator: str):
126129
selector_value = SelectorAbstraction.get_selector(selenium_locator)
127130
if SelectorAbstraction.is_xpath(selenium_locator):
128-
return (await self.page.xpath(selector_value))[0]
131+
return await self._querySelectorForXpath(selector_value)
132+
else:
133+
return await self._querySelector(selector_value)
134+
135+
async def _querySelector(self, selector: str):
136+
if self.selected_iframe is not None:
137+
return await self.selected_iframe.querySelector(selector=selector)
138+
else:
139+
return await self.page.querySelector(selector=selector)
140+
141+
async def _querySelectorForXpath(self, selector: str):
142+
if self.selected_iframe is not None:
143+
return (await self.selected_iframe.xpath(selector))[0]
129144
else:
130-
return await self.page.querySelector(selector_value)
145+
return (await self.page.xpath(selector))[0]
146+
147+
async def _querySelectorAll(self, selector: str):
148+
if self.selected_iframe is not None:
149+
return await self.selected_iframe.querySelectorAll(selector=selector)
150+
else:
151+
return await self.page.querySelectorAll(selector=selector)
152+
153+
async def _querySelectorAllForXpath(self, selector: str):
154+
if self.selected_iframe is not None:
155+
return (await self.selected_iframe.xpath(selector))
156+
else:
157+
return (await self.page.xpath(selector))
158+
159+
############
160+
# Select
161+
############
162+
async def select_with_selenium_locator(self, selenium_locator: str, values: str):
163+
selector_value = SelectorAbstraction.get_selector(selenium_locator)
164+
if SelectorAbstraction.is_xpath(selenium_locator):
165+
await self.get_selected_frame_or_page().evaluate('''
166+
element = document.evaluate('{selector_value}//option[contains(@value, "{values}")]', document, null, XPathResult.ANY_TYPE, null).iterateNext();
167+
element.selected = true;
168+
'''.format(selector_value=selector_value, values=values))
169+
else:
170+
return await self.get_selected_frame_or_page().select(selector_value, values)
171+
172+
############
173+
# Evaluate
174+
############
175+
async def evaluate_with_selenium_locator(self, evaluate: str):
176+
return await self.get_selected_frame_or_page().evaluate(evaluate)
131177

132178
##############################
133179
# iframe

0 commit comments

Comments
 (0)