def __init__(self):
        # Initialise globals
        self.robot = GRobot("demoAgent", colour="yellow")
        worldPath = "./../Maps/MazeExtra.map"  # this must be the same as that used in RobotGridWorld.pyw (and any other agents operating together)

        # import world
        newworld = pickle.load(open(worldPath, 'rb'))
        self.mapsize = len(newworld) - 2
        self.world = [[None] * (self.mapsize + 3)
                      for i in range(self.mapsize + 3)]  # World map

        # take out the buffer walls
        for i in range(self.mapsize):
            for j in range(self.mapsize):
                self.world[i][j] = newworld[i + 1][j + 1]

        # Erase hazards from memory
        # TODO: We will need to modify this to remove random rewards as well
        for i in range(0, self.mapsize):
            for j in range(0, self.mapsize):
                if self.world[i][j] == "Hazard":
                    self.world[i][j] = None
Exemple #2
0
 def setUp(self):
     self.robot = GRobot(display=False, develop=True, log_level=logging.DEBUG)
Exemple #3
0
class GRobotTest(unittest.TestCase):
    port = PORT
    display = False
    log_level = logging.INFO

    @classmethod
    def setUpClass(cls):
        http_server = WSGIServer(('', PORT), app, log=None)
        cls.server = gevent.spawn(http_server.serve_forever)
        gevent.sleep(3)

    @classmethod
    def tearDownClass(cls):
        cls.server.kill()

    def tearDown(self):
        self.robot=None

    def setUp(self):
        self.robot = GRobot(display=False, develop=True, log_level=logging.DEBUG)


    def test_open(self):
        self.robot.open(base_url)
        # self.assertEqual(page.url, base_url)
        self.assertTrue("Test page" in self.robot.content)

    # def test_page_with_no_cache_headers(self):
    #     self.robot.open("%sno-cache" % base_url)
    #     self.assertIsNotNone(page.content)
    #     self.assertIn("cache for me", page.content)

    # def test_http_status(self):
    #     self.robot.open("%sprotected" % base_url)
    #     self.assertEqual(page.http_status, 403)
    #     self.robot.open("%s404" % base_url)
    #     self.assertEqual(page.http_status, 404)

    def test_evaluate(self):
        self.robot.open(base_url)
        self.assertEqual(self.robot.evaluate("x='ghost'; x;"), 'ghost')

    # def test_external_api(self):
    #     self.robot.open("%smootools" % base_url)
    #     resources = self.robot.http_resources[:]
    #     self.assertEqual(len(resources), 2)
    #     self.assertEqual(type(self.robot.evaluate("document.id('list')")),
    #                      dict)

    # def test_extra_resource_content(self):
    #     self.robot.open("%smootools" % base_url)
    #     self.assertIn(u'MooTools: the javascript framework',
    #                   self.robot.http_resources[1].content)

    def test_extra_resource_binaries(self):
        self.robot.open("%simage" % base_url)
        self.assertEqual(self.robot.http_resources[1].content.__class__.__name__,
                         'QByteArray')

    def test_wait_for_selector(self):
        self.robot.open("%smootools" % base_url)
        self.robot.selenium("click", "id=button")
        self.robot.wait_for_selector("#list li:nth-child(2)")

        self.assertEqual(self.robot.http_resources[-1].url, "%sitems.json" % base_url)


    def test_settimeout(self):
        self.robot.open("%ssettimeout" % base_url)
        result = self.robot.evaluate("document.getElementById('result').innerHTML")
        self.assertEqual(result, 'Bad')
        gevent.sleep(4)
        result = self.robot.evaluate("document.getElementById('result').innerHTML")
        self.assertEqual(result, 'Good')


    def test_wait_for_text(self):
        self.robot.open("%smootools" % base_url)
        self.robot.selenium("click", "id=button")
        self.robot.wait_for_text("second item")
        self.assertEqual(self.robot.http_resources[-1].url, "%sitems.json" % base_url)


    def test_wait_for_timeout(self):
        self.robot.open("%s" % base_url)
        self.assertRaises(Exception, self.robot.wait_for_text, "undefined")


    def test_fill(self):
        self.robot.open("%sform" % base_url)
        values = {
            'text': 'Here is a sample text.',
            'email': '*****@*****.**',
            'textarea': 'Here is a sample text.\nWith several lines.',
            'checkbox': True,
            'selectbox': 'two',
            "radio": "first choice"
        }

        self.robot.seleniumChain([
            ("type", "id=text", 'Here is a sample text.'),
            ("type", "id=email", '*****@*****.**'),
            ("type", "id=textarea", 'Here is a sample text.\nWith several lines.'),
            ("check", "id=checkbox"),
            ("select", "id=selectbox", 'label=two'),
            ("click", "id=radio-first"),
        ])

        for field in ['text', 'email', 'textarea', 'selectbox']:
            value = self.robot.evaluate('document.getElementById("%s").value' % field)
            self.assertEqual(value, values[field])
        value = self.robot.evaluate(
            'document.getElementById("checkbox").checked')
        self.assertEqual(value, True)
        value = self.robot.evaluate(
            'document.getElementById("radio-first").checked')
        self.assertEqual(value, True)
        value = self.robot.evaluate(
            'document.getElementById("radio-second").checked')
        self.assertEqual(value, False)


    def test_fill_checkbox(self):
        self.robot.open("%sform" % base_url)


    def test_form_submission(self):
        self.robot.open("%sform" % base_url)

        self.robot.seleniumChain([('type', 'id=contact-form', 'Here is a sample text.'),
                                     ('click', "xpath=//input[@type='submit']"),
                                 ], expect_loading=True)

        self.assertIn('form successfully posted', self.robot.content)


    def test_global_exists(self):
        self.robot.open("%s" % base_url)
        self.assertTrue(self.robot.global_exists('myGlobal'))


    # def test_resource_headers(self):
    #     self.robot.open(base_url)
    #     self.assertEqual(page.headers['Content-Type'], 'text/html; charset=utf-8')


    def test_click_link(self):
        self.robot.open("%s" % base_url)
        self.robot.click('xpath=//a', expect_loading=True)
        self.assertEqual(self.robot.url, "%sform" % base_url)


    def test_cookies(self):
        self.robot.open("%scookie" % base_url)
        self.assertEqual(len(self.robot.cookies), 1)


    def test_delete_cookies(self):
        self.robot.open("%scookie" % base_url)
        self.robot.delete_cookies()
        self.assertEqual(len(self.robot.cookies), 0)


    def test_save_load_cookies(self):
        self.robot.delete_cookies()
        self.robot.open("%sset/cookie" % base_url)
        self.robot.save_cookies('testcookie.txt')
        self.robot.delete_cookies()
        self.robot.load_cookies('testcookie.txt')
        self.robot.open("%sget/cookie" % base_url)
        self.assertTrue('OK' in self.robot.content)
        os.remove('testcookie.txt')

    def test_wait_for_alert(self):
        self.robot.open("%salert" % base_url)
        self.robot.selenium('click','id=alert-button')
        msg = self.robot.wait_for_alert()
        self.assertEqual(msg, 'this is an alert')

    def test_confirm(self):
        self.robot.open("%salert" % base_url)
        with confirm(self.robot):
            self.robot.selenium('click','id=confirm-button')
        msg = self.robot.wait_for_alert()
        self.assertEqual(msg, 'you confirmed!')

    def test_no_confirm(self):
        self.robot.open("%salert" % base_url)
        with confirm(self.robot,False):
            self.robot.selenium('click','id=confirm-button')
        msg = self.robot.wait_for_alert()
        self.assertEqual(msg, 'you denied!')

    def test_confirm_callback(self):
        self.robot.open("%salert" % base_url)
        with confirm(self.robot,callback=lambda: False):
            self.robot.selenium('click','id=confirm-button')
        msg = self.robot.wait_for_alert()
        self.assertEqual(msg, 'you denied!')

    def test_prompt(self):
        self.robot.open("%salert" % base_url)
        with prompt(self.robot,'my value'):
            self.robot.selenium('click','id=prompt-button')
        value = self.robot.evaluate('promptValue')
        self.assertEqual(value, 'my value')


    def test_prompt_callback(self):
        self.robot.open("%salert" % base_url)
        with prompt(self.robot,callback=lambda: 'another value'):
            self.robot.selenium('click','id=prompt-button')
        value = self.robot.evaluate('promptValue')
        self.assertEqual(value, 'another value')

    def test_popup_messages_collection(self):

        self.robot.open("%salert" % base_url)

        def _test():
            self.assertIn('this is a confirm', self.robot.popup_messages)
            return True

        with confirm(self.robot,True,callback=_test):
            self.robot.selenium('click','id=confirm-button')

        self.robot.wait_for_alert()


        with prompt(self.robot,confirm=False):
            self.robot.selenium('click','id=prompt-button')

        self.assertIn('Prompt ?', self.robot.popup_messages)

        self.robot.selenium('click','id=alert-button')

        self.assertIn('this is an alert', self.robot.popup_messages)

    def test_prompt_default_value_true(self):
        self.robot.open("%salert" % base_url, default_popup_response=True)
        self.robot.selenium('click','id=confirm-button')
        msg = self.robot.wait_for_alert()
        self.assertEqual(msg, 'you confirmed!')

    def test_prompt_default_value_false(self):
        self.robot.open("%salert" % base_url, default_popup_response=False)
        self.robot.selenium('click','id=confirm-button')
        msg = self.robot.wait_for_alert()
        self.assertEqual(msg, 'you denied!')

    # def test_capture_to(self):
    #     self.robot.open(base_url)
    #     self.robot.capture_to('test.png')
    #     self.assertTrue(os.path.isfile('test.png'))
    #     os.remove('test.png')

    # def test_region_for_selector(self):
    #     self.robot.open(base_url)
    #     x1, y1, x2, y2 = self.robot.region_for_selector('h1')
    #     self.assertEqual(x1, 8)
    #     self.assertEqual(y1, 21)
    #     self.assertEqual(x2, 791)

    def test_capture_selector_to(self):
        self.robot.open(base_url)
        files = self.robot.capture_to('test.png', selector='h1')
        for f in files:
            self.assertTrue(os.path.isfile(f))
            os.remove(f)


    def test_set_field_value_checkbox_true(self):
        self.robot.open("%sform" % base_url)
        self.robot.selenium('check', 'id=checkbox')
        value = self.robot.evaluate(
            'document.getElementById("checkbox").checked')
        self.assertEqual(value, True)


    def test_set_field_value_checkbox_false(self):
        self.robot.open("%sform" % base_url)
        self.robot.selenium('uncheck', 'id=checkbox')
        value = self.robot.evaluate(
            'document.getElementById("checkbox").checked')
        self.assertEqual(value, False)


    def test_set_field_value_checkbox_multiple(self):
        self.robot.open("%sform" % base_url)
        self.robot.selenium('check',
                            'id=multiple-checkbox-second')
        value = self.robot.evaluate(
            'document.getElementById("multiple-checkbox-first").checked')
        self.assertEqual(value, False)
        value = self.robot.evaluate(
            'document.getElementById("multiple-checkbox-second").checked')
        self.assertEqual(value, True)


    def test_set_field_value_email(self):
        expected = '*****@*****.**'
        self.robot.open("%sform" % base_url)
        self.robot.selenium('type', 'id=email', expected)
        value = self.robot.evaluate('document.getElementById("email").value')
        self.assertEqual(value, expected)


    def test_set_field_value_text(self):
        expected = 'sample text'
        self.robot.open("%sform" % base_url)
        self.robot.selenium('type', 'name=text', expected)
        value = self.robot.evaluate('document.getElementById("text").value')
        self.assertEqual(value, expected)


    def test_set_field_value_radio(self):
        self.robot.open("%sform" % base_url)
        self.robot.selenium('click', 'id=radio-first')
        value = self.robot.evaluate(
            'document.getElementById("radio-first").checked')
        self.assertEqual(value, True)
        value = self.robot.evaluate(
            'document.getElementById("radio-second").checked')
        self.assertEqual(value, False)


    def test_set_field_value_textarea(self):
        expected = 'sample text\nanother line'
        self.robot.open("%sform" % base_url)
        self.robot.selenium('type', 'name=textarea', expected)
        value = self.robot.evaluate('document.getElementById("textarea").value')
        self.assertEqual(value, expected)


    def test_set_simple_file_field(self):
        self.robot.open("%supload" % base_url)
        self.robot.set_file_input('id=simple-file', os.path.dirname(__file__) + '/static/blackhat.jpg')
        self.robot.selenium('click', "xpath=//input[@type='submit']"
            , expect_loading=True)

        file_path = os.path.join(
            os.path.dirname(__file__), 'uploaded_blackhat.jpg')
        self.assertTrue(os.path.isfile(file_path))
        os.remove(file_path)


    def test_basic_http_auth_success(self):
        self.robot.open("%sbasic-auth" % base_url,
                               auth=('admin', 'secret'))
        self.assertIn('successfully authenticated' , self.robot.content )


    def test_basic_http_auth_error(self):
        self.robot.open("%sbasic-auth" % base_url,
                               auth=('admin', 'wrongsecret'))
        self.assertIn('Could not verify your access level for that URL.' , self.robot.content )


    def test_unsupported_content(self):
        self.robot.open("%ssend-file" % base_url)
        foo = open(os.path.join(os.path.dirname(__file__), 'static',
                                'foo.tar.gz'), 'r').read(1024)
        self.assertEqual(self.robot.http_resources[0].content, foo)


    def test_url_with_hash(self):
        self.robot.open("%surl-hash" % base_url)
        self.assertIsNotNone(self.robot.content)
        self.assertTrue("Test page" in self.robot.content)


    def test_url_with_hash_header(self):
        self.robot.open("%surl-hash-header" % base_url)
        self.assertTrue("Welcome" in self.robot.content)
Exemple #4
0
def main():
    robot = GRobot(display=True, log_level=logging.DEBUG, develop=False)

    # Chinese people love proxy.
    robot.set_proxy('socks5://127.0.0.1:7070')

    robot.open('https://twitter.com')

    # Login
    robot.key_clicks('id=signin-email', USERNAME)
    robot.key_clicks('id=signin-password', PASSWORD)

    robot.click("xpath=//td/button[contains(text(),'Sign in')]",
                expect_loading=True)

    # Post a twitter
    robot.key_clicks(
        "id=tweet-box-mini-home-profile",
        "GRobot is too powerful.https://github.com/DYFeng/GRobot")

    # Wait for post success
    while 1:
        robot.click(
            "xpath=//div[@class='module mini-profile']//button[text()='Tweet']"
        )
        try:
            robot.wait_for_text('Your Tweet was posted')
            break
        except:
            #Something go wrong,refresh page.
            if 'refresh the page' in robot.content():
                robot.reload()

    # Wait forever.
    robot.wait_forever()
Exemple #5
0
def main():
    robot = GRobot(display=True, log_level=logging.DEBUG, develop=False)

    # Chinese people love proxy.
    robot.set_proxy('socks5://127.0.0.1:7070')

    robot.open('https://twitter.com')

    # Login
    robot.key_clicks('id=signin-email', USERNAME)
    robot.key_clicks('id=signin-password', PASSWORD)

    robot.click("xpath=//td/button[contains(text(),'Sign in')]", expect_loading=True)

    # Post a twitter
    robot.key_clicks("id=tweet-box-mini-home-profile", "GRobot is too powerful.https://github.com/DYFeng/GRobot")

    # Wait for post success
    while 1:
        robot.click("xpath=//div[@class='module mini-profile']//button[text()='Tweet']")
        try:
            robot.wait_for_text('Your Tweet was posted')
            break
        except:
            #Something go wrong,refresh page.
            if 'refresh the page' in robot.content():
                robot.reload()

    # Wait forever.
    robot.wait_forever()
def main():
    username = None
    password = None
    with open('account.json', 'r') as account_file:
        raw_text = account_file.read().replace('\r\n', '')
        username = json.loads(raw_text)['username']
        password = json.loads(raw_text)['password']
        raw_text = None

    if username and password:
        robot = GRobot(display=True, develop=False, log_level=logging.DEBUG, loading_timeout=10, operate_timeout=10,
                       viewport_size=(400, 500))

        robot.open('https://www.landofbitcoin.com/login')
        # robot.open('http://www.baidu.com')

        robot.wait_for_page_loaded()

        # print robot.content().encode('utf-8')
        robot.type('name=username', username)
        robot.type('name=password', password)
        robot.click("xpath=/html/body/div[2]/div/div[1]/div/div[2]/form/input[2]", expect_loading=True)

        robot.wait_for_page_loaded()
        robot.webview.showMinimized()
        while True:
            print robot.content().encode('utf-8')
            if robot.content().encode('utf-8').find(
                    '<p class="text-center" id="faucet-lucky">Lucky number: <span id="lucky">') == -1:
                robot.webview.showNormal()
                robot.click('xpath=//*[@id="faucet"]/div/a', expect_loading=True)
                robot.wait_for_text('<span id="lucky">', -1)
                robot.webview.showMinimized()
            else:
                gevent.sleep(5)
Exemple #7
0
def main():
    # Show the browser window.Open the webkit inspector.
    robot = GRobot(display=True, develop=False, log_level=logging.DEBUG, loading_timeout=10, operate_timeout=10)

    # In China,people can only using proxy to access google.
    robot.set_proxy('socks5://127.0.0.1:7070')

    #Open google
    robot.open('http://www.google.com/')

    #Type out project and search.
    robot.type('name=q', 'GRobot github')
    robot.click('name=btnK', expect_loading=True)

    for i in xrange(1, 10):
        # Waiting for the ajax page loading.

        robot.wait_for_xpath("//tr/td[@class='cur' and text()='%s']" % i)

        if u'https://github.com/DYFeng/GRobot' in robot.content:
            print 'The porject in page', i
            break

        # Click the Next link.We don't use expect_loading.Because it's ajax loading,not page loading.
        robot.click("xpath=//span[text()='Next']")

    else:
        print "Can not found.Make a promotion for it."

    # Wait forever.
    robot.wait_forever()
class DemoAgent():
    def __init__(self):
        # Initialise globals
        self.robot = GRobot("demoAgent", colour="yellow")
        worldPath = "./../Maps/MazeExtra.map"  # this must be the same as that used in RobotGridWorld.pyw (and any other agents operating together)

        # import world
        newworld = pickle.load(open(worldPath, 'rb'))
        self.mapsize = len(newworld) - 2
        self.world = [[None] * (self.mapsize + 3)
                      for i in range(self.mapsize + 3)]  # World map

        # take out the buffer walls
        for i in range(self.mapsize):
            for j in range(self.mapsize):
                self.world[i][j] = newworld[i + 1][j + 1]

        # Erase hazards from memory
        # TODO: We will need to modify this to remove random rewards as well
        for i in range(0, self.mapsize):
            for j in range(0, self.mapsize):
                if self.world[i][j] == "Hazard":
                    self.world[i][j] = None

    def run(self):

        try:
            while True:
                char = screen.getch()
                if char == 'q' or char == 'Q':
                    break
                elif char == curses.KEY_RIGHT:
                    result = self.robot.right()
                elif char == curses.KEY_LEFT:
                    result = self.robot.left()
                elif char == curses.KEY_UP:
                    result = self.robot.forward()

                result = self.robot.look()

                # pull out values from world based on result coords
                cells = []
                for cell in result:
                    x = cell[1]
                    y = cell[2]
                    cells.append(self.cellVal(x, y))

                # print out values from look and from world (note they are the same)
                screen.erase()
                screen.addstr(0, 0, str(result))
                screen.addstr(1, 0, str(cells))
        finally:
            # shut down cleanly
            curses.nocbreak()
            screen.keypad(0)
            curses.echo()
            curses.endwin()
            exit()

    def cellVal(self, x, y):
        if x < 0 or x >= self.mapsize:
            return ("Wall", x, y)
        elif y < 0 or y >= self.mapsize:
            return ("Wall", x, y)
        else:
            return (self.world[x][y], x, y)
Exemple #9
0
class HumanAgent():
    def __init__(self):
        # Initialise globals
        self.robot = GRobot("HumanAgent", colour="yellow")
        self.heading = 90  #0=forward, 90 = right, 180 = down, 270 = left
        self.path = []
        worldPath = "./../Maps/MazeExtra.map"  # this must be the same as that used in RobotGridWorld.pyw (and any other agents operating together)

        # import world
        newworld = pickle.load(open(worldPath, 'rb'))
        self.mapsize = len(newworld) - 2
        self.world = [[None] * (self.mapsize + 3)
                      for i in range(self.mapsize + 3)]  # World map

        # take out the buffer walls
        for i in range(self.mapsize):
            for j in range(self.mapsize):
                self.world[i][j] = newworld[i + 1][j + 1]

        # Erase hazards from memory
        # TODO: We will need to modify this to remove random rewards as well
        for i in range(0, self.mapsize):
            for j in range(0, self.mapsize):
                if self.world[i][j] == "Hazard":
                    self.world[i][j] = None

    def run(self):
        self.plan()
        self.move()

    def plan(self):
        #path plan with a*
        G = Graph(self.mapsize, self.world)
        start = G.get_vertex(1 + self.mapsize * 0)
        print("Start: ", start.get_xy(self.mapsize))
        goal = G.get_vertex(1 + self.mapsize * 15)  #goal pos for MazeExtra.map
        print("Goal: ", goal.get_xy(self.mapsize))
        t = a_star(G, start, goal)
        self.path = reversed(t)

    def move(self):
        for coord in self.path:
            (i, j) = coord
            (x, y) = (i, j)
            direction = (x - self.robot.posx, y - self.robot.posy)
            print((x, y), (self.robot.posx, self.robot.posy))

            if direction == (1, 0):  #right
                if self.heading == 0:
                    self.robot.forward()
                else:
                    for i in range(int(self.heading / 90)):
                        self.robot.right()
                    self.robot.forward()
                    self.heading = 0

                self.robot.posx += 1

            elif direction == (0, 1):  #up
                if self.heading == 90:
                    self.robot.forward()
                elif self.heading > 90:
                    for i in range(int((self.heading - 90) / 90)):
                        self.robot.right()
                    self.robot.forward()
                    self.heading = 90
                else:  #facing right
                    self.robot.left()
                    self.robot.forward()
                    self.heading = 90

                self.robot.posy += 1

            elif direction == (-1, 0):  #left
                if self.heading == 180:
                    self.robot.forward()
                elif self.heading < 180:
                    for i in range(int((180 - self.heading) / 90)):
                        self.robot.left()
                    self.robot.forward()
                    self.heading = 180
                else:  # facing down = 270
                    self.robot.right()
                    self.robot.forward()
                    self.heading = 180

                self.robot.posx -= 1

            elif direction == (0, -1):  #down
                if self.heading == 270:
                    self.robot.forward()
                else:
                    for i in range(int((270 - self.heading) / 90)):
                        self.robot.left()
                    self.robot.forward()
                    self.heading = 270

                self.robot.posy -= 1