test_rwt_app_chooser.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 # Software License Agreement (BSD License)
5 #
6 # Copyright (c) 2021, Kei Okada
7 # All rights reserved.
8 #
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions
11 # are met:
12 #
13 # * Redistributions of source code must retain the above copyright
14 # notice, this list of conditions and the following disclaimer.
15 # * Redistributions in binary form must reproduce the above
16 # copyright notice, this list of conditions and the following
17 # disclaimer in the documentation and/or other materials provided
18 # with the distribution.
19 # * Neither the name of the Copyright holder. nor the
20 # names of its contributors may be used to endorse or promote products
21 # derived from this software without specific prior written permission.
22 #
23 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 # POSSIBILITY OF SUCH DAMAGE.
35 #
36 
37 import argparse
38 import sys
39 import time
40 import rospy
41 import rostest
42 import unittest
43 
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
49 
50 import pkg_resources
51 selenium_version = pkg_resources.get_distribution("selenium").version
52 # Check if selenium version is greater than 4.3.0
53 if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version("4.3.0"):
54  from selenium.webdriver.common.by import By
55 
56 from sound_play.msg import SoundRequest
57 
58 CLASSNAME = 'rwt_app_chooser'
59 
60 class TestRwtAppChooser(unittest.TestCase):
61 
62  def robotsound_cb(self, msg):
63  rospy.logwarn("{} received".format(msg))
64  self.robotsound_msg = msg
66 
67  def __init__(self, *args):
68  super(TestRwtAppChooser, self).__init__(*args)
69  rospy.init_node('test_rwt_app_chooser')
70 
71  def setUp(self):
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()
76 
77  self.robotsound_msg = None
79 
80  rospy.Subscriber('/robotsound', SoundRequest, self.robotsound_cb)
81  self.url_base = rospy.get_param("url_roswww_testserver")
82 
83  opts = webdriver.firefox.options.Options()
84  if not args.no_headless:
85  opts.add_argument('-headless')
86  self.browser = webdriver.Firefox(options=opts)
87 
88  self.wait = webdriver.support.ui.WebDriverWait(self.browser, 10)
89  # maximize screen
90  if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version("4.3.0"):
91  self.browser.fullscreen_window()
92  else:
93  self.browser.find_element_by_tag_name("html").send_keys(Keys.F11)
94 
95  def tearDown(self):
96  try:
97  self.browser.close()
98  self.browser.quit()
99  except:
100  pass
101 
103  url = '%s/rwt_app_chooser' % (self.url_base)
104  rospy.logwarn("Accessing to %s" % url)
105 
106  self.browser.get(url)
107 
108  # Add Robot
109  self.wait.until(EC.presence_of_element_located((By.ID, "add")))
110  add_robot = self.find_element_by_id("add")
111  self.assertIsNotNone(add_robot, "Object id=add not found")
112  add_robot.click()
113 
114  self.wait.until(EC.presence_of_element_located((By.ID, "robot-name")))
115  name = self.find_element_by_id("robot-name")
116  self.assertIsNotNone(name, "Object id=robot-name not found")
117  name.clear();
118  name.send_keys('pr1012')
119 
120  self.wait.until(EC.presence_of_element_located((By.ID, "robot-uri")))
121  uri = self.find_element_by_id("robot-uri")
122  self.assertIsNotNone(uri, "Object id=robot-uri not found")
123  uri.clear();
124  uri.send_keys('ws://localhost:9090/')
125 
126  self.wait.until(EC.presence_of_element_located((By.ID, "add-btn")))
127  add = self.find_element_by_id("add-btn")
128  self.assertIsNotNone(add, "Object id=add-btn not found")
129  add.click()
130 
131  # confirm
132  self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[class='btn btn-flat primary btn-confirm']")))
133  confirm = self.find_element_by_css_selector("a[class='btn btn-flat primary btn-confirm']")
134  self.assertIsNotNone(confirm, "Object a[class='btn btn-flat primary btn-confirm']")
135  confirm.click()
136 
137  # Select Robot
138  self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "span[class='title']")))
139  select_robot = self.find_element_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))
143 
144  self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "li[class='item-expanded robot-list-item']")))
145  select = self.find_element_by_css_selector("li[class='item-expanded robot-list-item']")
146  self.assertIsNotNone(select, "Object li[class='item-expanded robot-list-item']")
147  select.click()
148 
149  # Select Task
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))
154  task_text.click()
155  rospy.logwarn("Selected {} task".format(task_text.text))
156 
157  # input user name
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]")))
161  user = self.find_element_by_css_selector("input[type='text'][placeholder]")
162  self.assertIsNotNone(user, "Object input[type='text'][placeholder]")
163  user.send_keys('user')
164  rospy.logerr('Done')
165 
166  self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[class='btn btn-flat primary btn-confirm']")))
167  confirm = self.find_element_by_css_selector("a[class='btn btn-flat primary btn-confirm']")
168  self.assertIsNotNone(confirm, "Object a[class='btn btn-flat primary btn-confirm']")
169  confirm.click()
170  rospy.logerr('Done')
171 
172  # input app arguments
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]")))
176  args_candidate = self.find_elements_by_css_selector("input[type='text'][placeholder]")
177  args = None
178  for a in args_candidate:
179  if a.is_displayed():
180  args = a
181  self.assertTrue(args is not None)
182  self.assertIsNotNone(user, "Object input[type='text'][placeholder]")
183  args.send_keys('{}')
184  rospy.logerr('Done')
185 
186  self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a[class='btn btn-flat primary btn-confirm']")))
187  ok_candidate = self.find_elements_by_css_selector("a[class='btn btn-flat primary btn-confirm']")
188  ok = None
189  for o in ok_candidate:
190  if o.is_displayed():
191  ok = o
192  self.assertTrue(ok is not None)
193  self.assertIsNotNone(ok, "Object a[class='btn btn-flat primary btn-confirm']")
194  ok.click()
195  rospy.logerr('Done')
196 
197  # 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']")))
201  confirm = self.find_element_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)
205 
206  # check task works
207  loop = 0
208  while loop < 30 and self.robotsound_msg == None:
209  loop = loop + 1
210  time.sleep(1)
211  rospy.logwarn("wait for message...")
212  try:
213  # if we staill have Launch application window, retry execute script
214  if self.find_element_by_xpath("//h3[contains(text(), 'Launch application')]"):
215  confirm = self.find_element_by_css_selector("a[class='btn btn-flat primary btn-confirm']")
216  self.browser.execute_script("arguments[0].scrollIntoView();", confirm)
217  self.browser.execute_script("arguments[0].click();", confirm)
218  except:
219  pass
220 
221  self.assertNotEqual(self.robotsound_msg, None, "robotsound_msg did not received")
222 
223  def find_element_by_id(self, name):
224  if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version("4.3.0"):
225  return self.browser.find_element(By.ID, name)
226  else:
227  return self.browser.find_element_by_id(name)
228 
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)
232  else:
233  return self.browser.find_element_by_css_selector(name)
234 
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)
238  else:
239  return self.browser.find_elements_by_css_selector(name)
240 
241  def find_element_by_xpath(self, 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)
244  else:
245  return self.browser.find_element_by_xpath(name)
246 
247 
248 if __name__ == '__main__':
249  try:
250  rostest.run('rwt_app_chooser', CLASSNAME, TestRwtAppChooser, sys.argv)
251  except KeyboardInterrupt:
252  pass
253  print("{} exiting".format(CLASSNAME))
test_rwt_app_chooser.TestRwtAppChooser.browser
browser
Definition: test_rwt_app_chooser.py:86
test_rwt_app_chooser.TestRwtAppChooser.find_element_by_id
def find_element_by_id(self, name)
Definition: test_rwt_app_chooser.py:223
test_rwt_app_chooser.TestRwtAppChooser.tearDown
def tearDown(self)
Definition: test_rwt_app_chooser.py:95
test_rwt_app_chooser.TestRwtAppChooser.robotsound_msg_received
robotsound_msg_received
Definition: test_rwt_app_chooser.py:65
test_rwt_app_chooser.TestRwtAppChooser.find_elements_by_css_selector
def find_elements_by_css_selector(self, name)
Definition: test_rwt_app_chooser.py:235
test_rwt_app_chooser.TestRwtAppChooser.find_element_by_css_selector
def find_element_by_css_selector(self, name)
Definition: test_rwt_app_chooser.py:229
test_rwt_app_chooser.TestRwtAppChooser.url_base
url_base
Definition: test_rwt_app_chooser.py:81
test_rwt_app_chooser.TestRwtAppChooser.test_rwt_app_chooser
def test_rwt_app_chooser(self)
Definition: test_rwt_app_chooser.py:102
test_rwt_app_chooser.TestRwtAppChooser.__init__
def __init__(self, *args)
Definition: test_rwt_app_chooser.py:67
test_rwt_app_chooser.TestRwtAppChooser.robotsound_msg
robotsound_msg
Definition: test_rwt_app_chooser.py:64
test_rwt_app_chooser.TestRwtAppChooser.wait
wait
Definition: test_rwt_app_chooser.py:88
test_rwt_app_chooser.TestRwtAppChooser
Definition: test_rwt_app_chooser.py:60
test_rwt_app_chooser.TestRwtAppChooser.setUp
def setUp(self)
Definition: test_rwt_app_chooser.py:71
test_rwt_app_chooser.TestRwtAppChooser.robotsound_cb
def robotsound_cb(self, msg)
Definition: test_rwt_app_chooser.py:62
test_rwt_app_chooser.TestRwtAppChooser.find_element_by_xpath
def find_element_by_xpath(self, name)
Definition: test_rwt_app_chooser.py:241


rwt_app_chooser
Author(s): Yuki Furuta
autogenerated on Sat Jun 3 2023 02:43:51