test_rwt_steer.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 
49 import pkg_resources
50 selenium_version = pkg_resources.get_distribution("selenium").version
51 # Check if selenium version is greater than 4.3.0
52 if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version("4.3.0"):
53  from selenium.webdriver.support.ui import WebDriverWait
54  from selenium.webdriver.common.by import By
55 
56 from geometry_msgs.msg import Twist
57 
58 CLASSNAME = 'rwt_steer'
59 
60 class TestRwtSteer(unittest.TestCase):
61 
62  def joy_cb(self, msg):
63  rospy.logwarn("{} received".format(msg))
64  self.joy_msg = msg
66 
67  def __init__(self, *args):
68  super(TestRwtSteer, self).__init__(*args)
69  rospy.init_node('test_rwt_steer')
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.joy_msg = None
78  self.joy_msg_received = 0
79 
80  rospy.Subscriber('/joy', Twist, self.joy_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 
102  def test_rwt_steer(self):
103  url = '%s/rwt_steer' % (self.url_base)
104  rospy.logwarn("Accessing to %s" % url)
105 
106  self.browser.get(url)
107 
108  # check settings
109  self.wait.until(EC.presence_of_element_located((By.ID, "button-ros-master-settings")))
110  settings = self.find_element_by_id("button-ros-master-settings")
111  self.assertIsNotNone(settings, "Object id=button-ros-master-settings not found")
112  settings.click()
113 
114  self.wait.until(EC.presence_of_element_located((By.ID, "input-ros-master-uri")))
115  uri = self.find_element_by_id("input-ros-master-uri")
116  self.assertIsNotNone(uri, "Object id=input-ros-master-uri not found")
117  uri.clear();
118  uri.send_keys('ws://localhost:9090/')
119 
120  self.wait.until(EC.presence_of_element_located((By.ID, "button-ros-master-connect")))
121  connect = self.find_element_by_id("button-ros-master-connect")
122  self.assertIsNotNone(connect, "Object id=button-ros-master-connect")
123  connect.click()
124 
125  # check image topic
126  self.wait.until(EC.presence_of_element_located((By.ID, "image-topic-select")))
127  image_topic = self.find_element_by_id("image-topic-select")
128  self.assertIsNotNone(image_topic, "Object id=image-topic-select not found")
129  loop = 0
130  while image_topic.text == u'' and loop < 10:
131  loop = loop + 1
132  time.sleep(1)
133  image_topic = self.find_element_by_id("image-topic-select")
134  self.assertIsNotNone(image_topic, "Object id=image-topic-select not found")
135  self.assertTrue(u'/image_publisher/image_raw' in image_topic.text)
136 
137  self.wait.until(EC.presence_of_element_located((By.ID, "image-topic-button")))
138  view= self.find_element_by_id("image-topic-button")
139  self.assertIsNotNone(view, "Object id=image-topic-button")
140  view.click()
141 
142  # check joy topic
143  self.wait.until(EC.presence_of_element_located((By.ID, "joy-topic-select")))
144  joy_topic = self.find_element_by_id("joy-topic-select")
145  self.assertIsNotNone(joy_topic, "Object id=joy-topic-select not found")
146  loop = 0
147  while joy_topic.text == u'' and loop < 10:
148  loop = loop + 1
149  time.sleep(1)
150  joy_topic = self.find_element_by_id("joy-topic-select")
151  self.assertIsNotNone(joy_topic, "Object id=joy-topic-select not found")
152  self.assertTrue(u'/joy' in joy_topic.text)
153 
154  self.wait.until(EC.presence_of_element_located((By.ID, "joy-topic-button")))
155  select = self.find_element_by_id("joy-topic-button")
156  self.assertIsNotNone(select, "Object id=joy-topic-button")
157  select.click()
158 
159  self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, "front")))
160  front = self.find_element_by_class_name("front")
161  self.assertIsNotNone(select, "Object class=front")
162  front.click()
163 
164  action = webdriver.common.action_chains.ActionChains(self.browser)
165  loop = 0
166  while loop < 10 and self.joy_msg_received < 4:
167  action.move_to_element_with_offset(front, 5, 5)
168  action.click()
169  action.perform()
170  loop = loop + 1
171  time.sleep(1)
172 
173  self.assertIsNotNone(self.joy_msg)
174 
175  def find_element_by_id(self, name):
176  if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version("4.3.0"):
177  return self.browser.find_element(By.ID, name)
178  else:
179  return self.browser.find_element_by_id(name)
180 
181  def find_element_by_class_name(self, name):
182  if pkg_resources.parse_version(selenium_version) >= pkg_resources.parse_version("4.3.0"):
183  return self.browser.find_element(By.CLASS_NAME, name)
184  else:
185  return self.browser.find_element_by_class_name(name)
186 
187 if __name__ == '__main__':
188  try:
189  rostest.run('rwt_steer', CLASSNAME, TestRwtSteer, sys.argv)
190  except KeyboardInterrupt:
191  pass
192  print("{} exiting".format(CLASSNAME))
test_rwt_steer.TestRwtSteer.__init__
def __init__(self, *args)
Definition: test_rwt_steer.py:67
test_rwt_steer.TestRwtSteer.tearDown
def tearDown(self)
Definition: test_rwt_steer.py:95
test_rwt_steer.TestRwtSteer.joy_cb
def joy_cb(self, msg)
Definition: test_rwt_steer.py:62
test_rwt_steer.TestRwtSteer.find_element_by_class_name
def find_element_by_class_name(self, name)
Definition: test_rwt_steer.py:181
test_rwt_steer.TestRwtSteer.find_element_by_id
def find_element_by_id(self, name)
Definition: test_rwt_steer.py:175
test_rwt_steer.TestRwtSteer.setUp
def setUp(self)
Definition: test_rwt_steer.py:71
test_rwt_steer.TestRwtSteer.joy_msg
joy_msg
Definition: test_rwt_steer.py:64
test_rwt_steer.TestRwtSteer.test_rwt_steer
def test_rwt_steer(self)
Definition: test_rwt_steer.py:102
test_rwt_steer.TestRwtSteer
Definition: test_rwt_steer.py:60
test_rwt_steer.TestRwtSteer.url_base
url_base
Definition: test_rwt_steer.py:81
test_rwt_steer.TestRwtSteer.wait
wait
Definition: test_rwt_steer.py:88
test_rwt_steer.TestRwtSteer.joy_msg_received
joy_msg_received
Definition: test_rwt_steer.py:65
test_rwt_steer.TestRwtSteer.browser
browser
Definition: test_rwt_steer.py:86


rwt_steer
Author(s): Shingo Kitagawa , Yug Ajmera
autogenerated on Sat Jun 3 2023 02:44:01