Beispiel #1
0
    def analysis_with_other_browser( self ):
        # 1. check url is the same or not : should be the same
        # 2. check state is the same or not : should be the same
        
        dom_list1,url1 =self.executor.get_dom_list(self.configuration)
        dom_list2,url2 =self.other_executor.get_dom_list(self.configuration)

        if url1!=url2:
            print ("===different pages")
            logging.info('CBT:browser 1 page:%s browser 2 page:%s| page are different', url1, url2 )
        elif url1==url2:
            string="url is same: "+self.executor.get_url()
            print(string)
            logging.info(' CBT_events : '+ string )
        '''
        if dom_list1==dom_list2:
            string="dom tree is same: "+self.executor.get_url()
            print(string)
            logging.info(' CBT_events : '+ string )
        '''
        if DomAnalyzer.is_equal(dom_list1[0]['dom'],dom_list2[0]['dom']):
            print("===same dom tree")
            logging.info('CBT: same dom tree')
        else:
            print ("===different dom_tree")
            #need domtree mapping
            logging.info('CBT: browser 1 dom:%s browser 2 dom:%s| dom trees are different', url1, url2 )
Beispiel #2
0
    def crawl(self, depth, prev_state=None):
        if depth <= self.configuration.get_max_depth():
            cs = self.automata.get_current_state()
            if not self.violate_invariant(cs.get_dom(), cs.get_id()):
                candidate_clickables = DomAnalyzer.get_clickables(cs.get_dom(), prev_state.get_dom() if prev_state else None)
                self.num_clickables['unexamined'] += len(candidate_clickables)
                for clickable in candidate_clickables:
                    # prefetch image of the clickable
                    time.sleep(0.2)  # time for correctly fetching image
                    img_name = cs.get_id() + '-' + clickable.get_id() + '.png'
                    img_data = self.executor.get_screenshot(clickable)

                    # fire the clickable
                    logger.debug('Fire event in state %s', cs.get_id())
                    self.executor.empty_form(clickable)
                    self.executor.fill_form(clickable)
                    ft = FireEventThread(self.executor, clickable)
                    ft.start()
                    ft.join(self.configuration.get_sleep_time()*2)  # time out after sleep_time*2 seconds
                    if ft.is_alive():  # timed out
                        logger.error('No response while firing an event. Execution sequences:')
                        self.exe_stack.append(clickable)  # add the clickable triggering No Response
                        for c in self.exe_stack:
                            logger.error(c)
                        logger.error('Total clickables found: %d (true: %d, false: %d, unexamined: %d)',
                                     self.num_clickables['unexamined'] + self.num_clickables['true'] + self.num_clickables['false'],
                                     self.num_clickables['true'],
                                     self.num_clickables['false'],
                                     self.num_clickables['unexamined']
                                     )
                        logger.error('Program terminated.')
                        sys.exit()
                    time.sleep(self.configuration.get_sleep_time())
                    self.num_clickables['unexamined'] -= 1

                    new_dom = self.executor.get_source()
                    if DomAnalyzer.is_equal(cs.get_dom(), new_dom):
                        self.num_clickables['false'] += 1
                    else:
                        self.num_clickables['true'] += 1
                        cs.add_clickable(clickable)
                        self.exe_stack.append(clickable)
                        self.save_screenshot(img_name, img_data, 'clickable')
                        ns, is_newly_added = self.automata.add_state(State(new_dom))
                        self.automata.add_edge(cs, ns, clickable)
                        if is_newly_added:
                            self.save_screenshot(ns.get_id() + '.png', self.executor.get_screenshot(), 'state')
                            self.save_dom(ns)
                            self.automata.change_state(ns)
                            self.crawl(depth+1, cs)
                        self.exe_stack.pop(-1)
                        self.automata.change_state(cs)
                        self.backtrack(cs)
Beispiel #3
0
 def check_dom_tree(self):
   
     
     if url1!=url2:
         print ("===different pages")
         logging.info('CBT:browser 1 page:%s browser 2 page:%s| page are different', url1, url2 )
     if DomAnalyzer.is_equal(dom_tree1,dom_tree2):
         print("===same dom tree")
         logging.info('CBT: same dom tree')
     else:
         print ("===different dom_tree")
         #need domtree mapping
         logging.info('CBT: browser 1 dom:%s browser 2 dom:%s| dom trees are different', url1, url2 )
Beispiel #4
0
 def add_state(self, state):
     # check if the automata is empty
     if not self._initial_state:
         self._initial_state = state
         self._current_state = state
     else:
         # check if the dom is duplicated
         for s in self._states:
             if DomAnalyzer.is_equal(s.get_dom(), state.get_dom()):
                 return s, False
     state_id = state.get_id() if state.get_id() else str(len(self._states))
     state.set_id(state_id)
     self._states.append(state)
     return state, True
Beispiel #5
0
 def add_state(self, state):
     # check if the automata is empty
     if not self._initial_state:
         self._initial_state = state
         self._current_state = state
     else:
         # check if the dom is duplicated
         for s in self._states:
             if DomAnalyzer.is_equal(s.get_dom(), state.get_dom()):
                 return s, False
     state_id = state.get_id() if state.get_id() else str(len(self._states))
     state.set_id(state_id)
     self._states.append(state)
     return state, True
Beispiel #6
0
    def crawl(self, depth, prev_state=None):
        if depth <= self.configuration.get_max_depth():
            cs = self.automata.get_current_state()
            if not self.violate_invariant(cs.get_dom(), cs.get_id()):
                candidate_clickables = DomAnalyzer.get_clickables(
                    cs.get_dom(),
                    prev_state.get_dom() if prev_state else None)
                self.num_clickables['unexamined'] += len(candidate_clickables)
                for clickable in candidate_clickables:
                    # prefetch image of the clickable
                    time.sleep(0.2)  # time for correctly fetching image
                    img_name = cs.get_id() + '-' + clickable.get_id() + '.png'
                    img_data = self.executor.get_screenshot(clickable)

                    # fire the clickable
                    logger.debug('Fire event in state %s', cs.get_id())
                    self.executor.empty_form(clickable)
                    self.executor.fill_form(clickable)
                    ft = FireEventThread(self.executor, clickable)
                    ft.start()
                    ft.join(self.configuration.get_sleep_time() *
                            2)  # time out after sleep_time*2 seconds
                    if ft.is_alive():  # timed out
                        logger.error(
                            'No response while firing an event. Execution sequences:'
                        )
                        self.exe_stack.append(
                            clickable
                        )  # add the clickable triggering No Response
                        for c in self.exe_stack:
                            logger.error(c)
                        logger.error(
                            'Total clickables found: %d (true: %d, false: %d, unexamined: %d)',
                            self.num_clickables['unexamined'] +
                            self.num_clickables['true'] +
                            self.num_clickables['false'],
                            self.num_clickables['true'],
                            self.num_clickables['false'],
                            self.num_clickables['unexamined'])
                        logger.error('Program terminated.')
                        sys.exit()
                    time.sleep(self.configuration.get_sleep_time())
                    self.num_clickables['unexamined'] -= 1

                    new_dom = self.executor.get_source()
                    if DomAnalyzer.is_equal(cs.get_dom(), new_dom):
                        self.num_clickables['false'] += 1
                    else:
                        self.num_clickables['true'] += 1
                        cs.add_clickable(clickable)
                        self.exe_stack.append(clickable)
                        self.save_screenshot(img_name, img_data, 'clickable')
                        ns, is_newly_added = self.automata.add_state(
                            State(new_dom))
                        self.automata.add_edge(cs, ns, clickable)
                        if is_newly_added:
                            self.save_screenshot(
                                ns.get_id() + '.png',
                                self.executor.get_screenshot(), 'state')
                            self.save_dom(ns)
                            self.automata.change_state(ns)
                            self.crawl(depth + 1, cs)
                        self.exe_stack.pop(-1)
                        self.automata.change_state(cs)
                        self.backtrack(cs)