Skip to content

Commit da215c6

Browse files
authored
Support dropdown keywords (#40)
* Init dropdown keyword and demo * Add Select dropdown by label
1 parent 61e58b1 commit da215c6

File tree

7 files changed

+106
-1
lines changed

7 files changed

+106
-1
lines changed

Examples/form-demo.robot

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
*** Settings ***
2+
Library Dialogs
3+
Library PuppeteerLibrary
4+
Test Setup Open browser to test page
5+
Test Teardown Close Browser
6+
7+
8+
*** Variables ***
9+
${HOME_PAGE_URL} http://127.0.0.1:7272/form.html
10+
11+
12+
*** Test Cases ***
13+
Select dropdown list by values with id
14+
Select From List By Value id=cars audi
15+
16+
Select dropdown list by values with xpath
17+
Select From List By Value xpath=//select[@id="cars"] audi
18+
19+
Select dropdown list by labels with id
20+
Select From List By Label id=cars Audi
21+
22+
Select dropdown list by labels with xpath
23+
Select From List By Label xpath=//select[@id="cars"] Audi
24+
25+
*** Keywords ***
26+
Open browser to test page
27+
${HEADLESS} Get variable value ${HEADLESS} ${False}
28+
&{options} = create dictionary headless=${HEADLESS}
29+
Open browser ${HOME_PAGE_URL} options=${options}
30+

PuppeteerLibrary/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
AlertKeywordsAsync,
1111
BrowserManagementKeywords,
1212
BrowserManagementKeywordsAsync,
13+
DropdownKeywords,
14+
DropdownKeywordsAsync,
1315
ElementKeywords,
1416
ElementKeywordsAsync,
1517
FormElementKeywords,
@@ -102,6 +104,7 @@ def __init__(self):
102104
libraries = [
103105
AlertKeywords(self),
104106
BrowserManagementKeywords(self),
107+
DropdownKeywords(self),
105108
ElementKeywords(self),
106109
FormElementKeywords(self),
107110
JavascriptKeywords(self),
@@ -117,6 +120,7 @@ def __init__(self):
117120
self.async_libraries = [
118121
AlertKeywordsAsync(self),
119122
BrowserManagementKeywordsAsync(self),
123+
DropdownKeywordsAsync(self),
120124
ElementKeywordsAsync(self),
121125
FormElementKeywordsAsync(self),
122126
JavascriptKeywordsAsync(self),

PuppeteerLibrary/keywords/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from .alert_async import AlertKeywordsAsync
33
from .browsermanagement import BrowserManagementKeywords
44
from .browsermanagement_async import BrowserManagementKeywordsAsync
5+
from .dropdown import DropdownKeywords
6+
from .dropdown_async import DropdownKeywordsAsync
57
from .element import ElementKeywords
68
from .element_async import ElementKeywordsAsync
79
from .formelement import FormElementKeywords
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from PuppeteerLibrary.base.librarycomponent import LibraryComponent
2+
from PuppeteerLibrary.base.robotlibcore import keyword
3+
from PuppeteerLibrary.keywords.dropdown_async import DropdownKeywordsAsync
4+
5+
6+
class DropdownKeywords(LibraryComponent):
7+
8+
def __init__(self, ctx):
9+
super().__init__(ctx)
10+
self.async_func = DropdownKeywordsAsync(self.ctx)
11+
12+
@keyword
13+
def select_from_list_by_value(self, locator, values):
14+
return self.loop.run_until_complete(self.async_func.select_from_list_by_value_async(locator, values))
15+
16+
@keyword
17+
def select_from_list_by_label(self, locator, labels):
18+
return self.loop.run_until_complete(self.async_func.select_from_list_by_label_async(locator, labels))
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from PuppeteerLibrary.base.robotlibcore import keyword
2+
from PuppeteerLibrary.base.librarycomponent import LibraryComponent
3+
from PuppeteerLibrary.locators import SelectorAbstraction
4+
5+
6+
class DropdownKeywordsAsync(LibraryComponent):
7+
8+
@keyword
9+
async def select_from_list_by_value_async(self, selenium_locator, values):
10+
selector_value = SelectorAbstraction.get_selector(selenium_locator)
11+
if SelectorAbstraction.is_xpath(selenium_locator):
12+
await self.ctx.get_current_page().evaluate('''
13+
element = document.evaluate('{selector_value}//option[contains(@value, "{values}")]', document, null, XPathResult.ANY_TYPE, null).iterateNext();
14+
element.selected = true;
15+
'''.format(selector_value=selector_value, values=values))
16+
else:
17+
await self.ctx.get_current_page().select(selector_value, values)
18+
19+
@keyword
20+
async def select_from_list_by_label_async(self, selenium_locator, labels):
21+
selector_value = SelectorAbstraction.get_selector(selenium_locator)
22+
if SelectorAbstraction.is_xpath(selenium_locator):
23+
await self.ctx.get_current_page().evaluate('''
24+
element = document.evaluate('{selector_value}//option[text()=\"{label}\"]', document, null, XPathResult.ANY_TYPE, null).iterateNext();
25+
element.selected = true;
26+
'''.format(selector_value=selector_value, label=labels))
27+
else:
28+
await self.ctx.get_current_page().evaluate('''
29+
selector_element = document.querySelector('{selector_value}');
30+
element = document.evaluate('//option[text()=\"{label}\"]', selector_element, null, XPathResult.ANY_TYPE, null).iterateNext();
31+
element.selected = true;
32+
'''.format(selector_value=selector_value, label=labels))

demoapp/html/form.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Title</title>
6+
</head>
7+
<body>
8+
<div style="margin-top: 30px; margin-bottom: 30px;">
9+
<label for="cars">Choose a car:</label>
10+
<select name="cars" id="cars">
11+
<option value="volvo">Volvo</option>
12+
<option value="saab">Saab</option>
13+
<option value="opel">Opel</option>
14+
<option value="audi">Audi</option>
15+
</select>
16+
</div>
17+
</body>
18+
</html>

demoapp/html/index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
</div>
4040
</div>
4141

42-
<div id="container" class="container">
42+
<div id="container" class="container" style="margin-bottom: 30px;">
4343
<h1>Login Page</h1>
4444
<p>Please input your user name and password and click the login button.</p>
4545
<form name="login_form" onsubmit="login(this.username_field.value, this.password_field.value); return false;">
@@ -72,5 +72,6 @@ <h3>Element property</h3>
7272
<button id="not-visible-button" style="display:None;">in visible button</button>
7373
</div>
7474
</div>
75+
7576
</body>
7677
</html>

0 commit comments

Comments
 (0)