44 from selenium
import webdriver
45 from selenium.webdriver.common.keys
import Keys
46 from selenium.webdriver.common.by
import By
47 from selenium.webdriver.support
import expected_conditions
as EC
48 from selenium.webdriver.support.ui
import Select
51 selenium_version = pkg_resources.get_distribution(
"selenium").version
53 if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version(
"4.3.0"):
54 from selenium.webdriver.common.by
import By
56 from sound_play.msg
import SoundRequest
58 CLASSNAME =
'rwt_app_chooser'
63 rospy.logwarn(
"{} received".format(msg))
68 super(TestRwtAppChooser, self).
__init__(*args)
69 rospy.init_node(
'test_rwt_app_chooser')
72 parser = argparse.ArgumentParser()
73 parser.add_argument(
'--no-headless', action=
'store_true',
74 help=
'start webdriver with headless mode')
75 args, unknown = parser.parse_known_args()
80 rospy.Subscriber(
'/robotsound', SoundRequest, self.
robotsound_cb)
81 self.
url_base = rospy.get_param(
"url_roswww_testserver")
83 opts = webdriver.firefox.options.Options()
84 if not args.no_headless:
85 opts.add_argument(
'-headless')
86 self.
browser = webdriver.Firefox(options=opts)
88 self.
wait = webdriver.support.ui.WebDriverWait(self.
browser, 10)
90 if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version(
"4.3.0"):
91 self.
browser.fullscreen_window()
93 self.
browser.find_element_by_tag_name(
"html").send_keys(Keys.F11)
103 url =
'%s/rwt_app_chooser' % (self.
url_base)
104 rospy.logwarn(
"Accessing to %s" % url)
109 self.
wait.until(EC.presence_of_element_located((By.ID,
"add")))
111 self.assertIsNotNone(add_robot,
"Object id=add not found")
114 self.
wait.until(EC.presence_of_element_located((By.ID,
"robot-name")))
116 self.assertIsNotNone(name,
"Object id=robot-name not found")
118 name.send_keys(
'pr1012')
120 self.
wait.until(EC.presence_of_element_located((By.ID,
"robot-uri")))
122 self.assertIsNotNone(uri,
"Object id=robot-uri not found")
124 uri.send_keys(
'ws://localhost:9090/')
126 self.
wait.until(EC.presence_of_element_located((By.ID,
"add-btn")))
128 self.assertIsNotNone(add,
"Object id=add-btn not found")
132 self.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"a[class='btn btn-flat primary btn-confirm']")))
134 self.assertIsNotNone(confirm,
"Object a[class='btn btn-flat primary btn-confirm']")
138 self.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"span[class='title']")))
140 self.assertIsNotNone(select_robot,
"Object div[class='item-content']/span[class='title']")
141 self.assertTrue(
u'pr1012' in select_robot.text)
142 rospy.logwarn(
"Selected {} robot".format(select_robot.text))
144 self.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"li[class='item-expanded robot-list-item']")))
146 self.assertIsNotNone(select,
"Object li[class='item-expanded robot-list-item']")
150 self.
wait.until(EC.presence_of_element_located((By.XPATH,
"//div/span[@class='Title' and contains(text(), 'Hello World')]")))
151 task_text = self.
find_element_by_xpath(
"//div/span[@class='Title' and contains(text(), 'Hello World')]")
152 self.assertIsNotNone(task_text,
"Object span[class='Title']")
153 self.assertTrue(
u'Hello World' in task_text.text,
"Hello World is not found in {}".format(task_text))
155 rospy.logwarn(
"Selected {} task".format(task_text.text))
158 rospy.logerr(
'Username Input')
159 self.
wait.until(EC.presence_of_element_located((By.XPATH,
'//h3[text()="Register user name"]')))
160 self.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"input[type='text'][placeholder]")))
162 self.assertIsNotNone(user,
"Object input[type='text'][placeholder]")
163 user.send_keys(
'user')
166 self.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"a[class='btn btn-flat primary btn-confirm']")))
168 self.assertIsNotNone(confirm,
"Object a[class='btn btn-flat primary btn-confirm']")
173 rospy.logerr(
'App args Input')
174 self.
wait.until(EC.presence_of_element_located((By.XPATH,
'//h3[text()="App arguments"]')))
175 self.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"input[type='text'][placeholder]")))
178 for a
in args_candidate:
181 self.assertTrue(args
is not None)
182 self.assertIsNotNone(user,
"Object input[type='text'][placeholder]")
186 self.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"a[class='btn btn-flat primary btn-confirm']")))
189 for o
in ok_candidate:
192 self.assertTrue(ok
is not None)
193 self.assertIsNotNone(ok,
"Object a[class='btn btn-flat primary btn-confirm']")
198 self.
wait.until(EC.presence_of_element_located((By.XPATH,
"//h3[contains(text(), 'Launch application')]")))
199 self.
wait.until(EC.presence_of_element_located((By.XPATH,
"//p[contains(text(), 'Launch Hello World?')]")))
200 self.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"a[class='btn btn-flat primary btn-confirm']")))
202 self.assertIsNotNone(confirm,
"Object a[class='btn btn-flat primary btn-confirm']")
203 self.
browser.execute_script(
"arguments[0].scrollIntoView();", confirm)
204 self.
browser.execute_script(
"arguments[0].click();", confirm)
211 rospy.logwarn(
"wait for message...")
216 self.
browser.execute_script(
"arguments[0].scrollIntoView();", confirm)
217 self.
browser.execute_script(
"arguments[0].click();", confirm)
221 self.assertNotEqual(self.
robotsound_msg,
None,
"robotsound_msg did not received")
224 if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version(
"4.3.0"):
225 return self.
browser.find_element(By.ID, name)
230 if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version(
"4.3.0"):
231 return self.
browser.find_element(By.CSS_SELECTOR, name)
236 if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version(
"4.3.0"):
237 return self.
browser.find_elements(By.CSS_SELECTOR, name)
242 if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version(
"4.3.0"):
243 return self.
browser.find_element(By.XPATH, name)
248 if __name__ ==
'__main__':
250 rostest.run(
'rwt_app_chooser', CLASSNAME, TestRwtAppChooser, sys.argv)
251 except KeyboardInterrupt:
253 print(
"{} exiting".format(CLASSNAME))