Best Python code snippet using playwright-python
pages.py
Source:pages.py  
1"""Provide pages for Command line interface App."""2import functools3import numpy4import six5import urwid6from urwid.compat import with_metaclass7from ..core import PKG_LOGGER, get_client, validate_connection8from ..util import wrap_connection_error9from .widgets import (FormFieldHorizontal, FormFieldHorizontalEdit,10                      FormFieldHorizontalPass, TicketCell, TicketColumn)11ZENDESK_LOGO = \12    " `////////////////.  :///////////////.  \n" + \13    "  mNNNNNNNNNNNNNNN-  dNNNNNNNNNNNNNm/   \n" + \14    "  -mNNNNNNNNNNNNN+   dNNNNNNNNNNNNs`    \n" + \15    "   .smNNNNNNNNNh-    dNNNNNNNNNNh.      \n" + \16    "     `:+syyso/`  ::  dNNNNNNNNm/        \n" + \17    "               .yN+  dNNNNNNNo`         \n" + \18    "              +NNN+  dNNNNNh.           \n" + \19    "            :dNNNN+  dNNNm:             \n" + \20    "          .yNNNNNN+  dNNo`              \n" + \21    "        `oNNNNNNNN+  dy.     `          \n" + \22    "       :mNNNNNNNNN+  -  -ohmNNNmho-     \n" + \23    "     .hNNNNNNNNNNN+   -hNNNNNNNNNNNh-   \n" + \24    "   `oNNNNNNNNNNNNN+  -NNNNNNNNNNNNNNN-  \n" + \25    "  /mNNNNNNNNNNNNNN+  yNNNNNNNNNNNNNNNy\ "26class AppElementMixin(with_metaclass(urwid.MetaSuper)):27    """28    Functionality common to app elements.29    - Run `refresh_widgets` whenever `render` or `keypress` is called.30    - Handle events.31    """32    # A mapping of keys to actions (override this).33    key_actions = {}34    def refresh_widgets(self, size):35        pass36    def _mix_render(self, size, focus=False):37        """Wrap super `render` to refresh widgets."""38        PKG_LOGGER.debug('{} rendering, size={} focus={}'.format(39            self.__class__.__name__, size, focus40        ))41        self.refresh_widgets(size)42    def _mix_keypress(self, size, key):43        """Wrap super `keypress` to refresh widgets."""44        PKG_LOGGER.debug('{} keypress, size={} key={}'.format(45            self.__class__.__name__, size, repr(key)46        ))47        # TODO: replace logic with urwid.command_map ?48        if key in self.key_actions:49            getattr(self, '_action_{}'.format(self.key_actions[key]))(50                size, key51            )52        self.refresh_widgets(size)53    def _action_exit(self, *_):54        raise urwid.ExitMainLoop()55    def _get_markup(self, ticket_dict, key, formatter=None):56        formatter = formatter or id57        unformatted = ticket_dict.get(key, '')58        try:59            return formatter(unformatted)60        except UnicodeEncodeError:61            if not isinstance(unformatted, six.text_type):62                unformatted = six.text_type(unformatted)63            unformatted = (unformatted).encode('ascii', errors='ignore')64            return formatter(unformatted)65    def modal_fatal_error(self, message=None, exc=None):66        """Cause a fatal error to be displayed and the program to exit."""67        message = "Error: {}".format(message) if message else "Fatal Error"68        # This could be called from a parent frame or a page.69        parent_frame = getattr(self, 'parent_frame', self)70        if message:71            PKG_LOGGER.critical(message)72            parent_frame.pages['ERROR'].page_title = message73        details = []74        if exc:75            PKG_LOGGER.critical(exc)76            details.insert(0, str(exc))77        details.append("press ctrl-c to exit")78        parent_frame.pages['ERROR'].error_details = "\n\n".join(details)79        parent_frame.set_page('ERROR')80class AppPageMixin(AppElementMixin):81    """Provide the interface for a page within an app."""82    _usage = ""83    _title = ""84    def __init__(self):85        """Wrap super __init__ as per `urwid.MetaClass` spec."""86        assert self.parent_frame87        self.__super.__init__()88    @property89    def page_usage(self):90        """Provide the usage message for this page."""91        return self._usage92    @property93    def page_title(self):94        """Provide the title for this page."""95        return self._title96    @property97    def page_status(self):98        """Provide an optional status line for this page."""99        return ""100class BlankPage(urwid.ListBox, AppPageMixin):101    """A blank app page."""102    def __init__(self, parent_frame, *args, **kwargs):103        """Wrap super `__init__` with extra metadata."""104        self.parent_frame = parent_frame105        self.__super.__init__(urwid.SimpleListWalker([]))106def mix_render_keypress(cls):107    """108    Shorthand for adding these methods into sublasses multiple times.109    Since each subclass of `AppElementMixin` calls the mixin keypress and110    render, this saves lots of redundant code111    """112    def keypress(self, size, key):113        """Wrap super `keypress` and perform actions."""114        # Scroll regardless of if a move was made115        self._mix_keypress(size, key)116        super(cls, self).keypress(size, key)117    def render(self, size, focus=False):118        """Wrap super and mixin `render`s."""119        self._mix_render(size, focus)120        return super(cls, self).render(size, focus)121    cls.keypress = keypress122    cls.render = render123    return cls124@mix_render_keypress125class TicketListPage(urwid.Columns, AppPageMixin):126    """An app page which displays a table of ticket information."""127    _selectable = True128    header_size = 1129    footer_size = 0130    # how quickly the scrolls when paging131    page_speed = 1132    _usage = (133        u"UP / DOWN / PAGE UP / PAGE DOWN scrolls. "134        u"SPACE / ENTER selects. "135        u"F8 exits."136    )137    _title = "Ticket List"138    key_actions = {139        ' ': 'open',140        'enter': 'open',141        'up': 'scroll',142        'down': 'scroll',143        'page up': 'scroll',144        'page down': 'scroll',145    }146    def __init__(self, parent_frame, *args, **kwargs):147        """Wrap super `__init__` with extra metadata."""148        # Cache access to generator to avoid api calls149        self._ticket_cache = []150        # Offset into the generator of the first visible element151        self.offset = 0152        # Index of the highlighted element153        self.index_highlighted = 0154        # Force a space of 1 between columns155        kwargs['dividechars'] = 0156        self.parent_frame = parent_frame157        self._ticket_generator = None158        self.__super.__init__(159            self.initial_column_widgets(), *args, **kwargs160        )161    @property162    def ticket_generator(self):163        """Try and get generator of tickets from API otherwise use cache."""164        if self._ticket_generator is not None:165            return self._ticket_generator166        client = self.parent_frame.client167        cache = client.tickets.cache.mapping['ticket'].cache168        # if we are in offline mode169        if cache.__class__.__name__ != 'TTLCache':170            self._ticket_generator = cache.values().__iter__()171        else:172            self._ticket_generator = wrap_connection_error(173                functools.partial(client.tickets, timeout=5),174                attempting="Connecting to API",175                on_fail=functools.partial(self.modal_fatal_error),176                on_success=functools.partial(177                    PKG_LOGGER.info, "Connected to API"178                )179            )180        return self._ticket_generator181    @property182    def next_ticket(self):183        # get before wrap so that we don't wrap twice184        generator = self.ticket_generator185        if generator is None:186            # want to exit getting ticket_generator cleanly in case there187            # was an error that needs to be displayed188            raise StopIteration()189        response = wrap_connection_error(190            injected=functools.partial(next, generator),191            attempting="Making an API request",192            on_fail=functools.partial(self.modal_fatal_error),193        )194        if response is None:195            raise StopIteration()196        return response197    @property198    def nonbody_overhead(self):199        """Rows taken up by the header and footer."""200        return self.header_size + self.footer_size201    @AppPageMixin.page_status.getter202    def page_status(self):203        """Provide the status message for this page."""204        # TODO: paging progress ("X - Y of Z")205        return ""206    def initial_column_widgets(self):207        """208        Generate the initial list of column widgets.209        Widget size is not known until render time, so no ticket entries are210        added to the widget list initially.211        """212        # First column is a selection indicator213        widget_list = [214            ('fixed', 1, TicketColumn(215                header=urwid.Divider(),216                body=urwid.Divider(),217                key='_selected'218            ))219        ]220        # Other widget columns show ticket data221        for key, meta in self.parent_frame.column_meta.items():222            if 'list_view' in meta and not meta['list_view']:223                continue224            title = meta.get('title', key.title())225            column_widget = TicketColumn(226                header=TicketCell(title),227                body=urwid.ListBox(urwid.SimpleListWalker([])),228                key=key229            )230            if 'sizing' in meta:231                column_widget = tuple(meta['sizing'] + [column_widget])232            widget_list.append(column_widget)233        return widget_list234    def get_tickets(self, offset, limit):235        """236        Fetch `limit` tickets from the generator starting at `offset`.237        Prefetch and cache 2 * `limit` tickets from the API.238        Args239        ----240            offset (:obj:`int`): the index of the first ticket required241            limit (:obj:`int`): the number of tickets required242        """243        prefetch_index = 2 * (limit) + offset244        try:245            while self.ticket_generator is not None:246                if prefetch_index < len(self._ticket_cache):247                    break248                self._ticket_cache.append(self.next_ticket)249        except StopIteration:250            pass251        return self._ticket_cache[offset:offset + limit]252    def _get_cell_widgets(self, key, visible_tickets, index_highlighted):253        meta = self.parent_frame.column_meta.get(key, {})254        formatter = meta.get('formatter', str)255        cell_kwargs = {256            'align': meta.get('align', urwid.LEFT)257        }258        cell_widgets = []259        for index, ticket in enumerate(visible_tickets):260            cell_kwargs['markup'] = self._get_markup(261                ticket.to_dict(), key, formatter262            )263            if key == '_selected' and index == index_highlighted:264                cell_kwargs['markup'] = '>'265            cell_widget = TicketCell(**cell_kwargs)266            if index == index_highlighted:267                cell_widget = urwid.AttrWrap(cell_widget, 'important')268            cell_widgets.append(cell_widget)269        return cell_widgets270    def refresh_widgets(self, size):271        """272        Populate frame body of each column with visible tickets.273        Args274        ----275            size (:obj:`tuple` of :obj:`int`): The allowed size of the widget276        """277        PKG_LOGGER.debug('refreshing, size={}'.format(size))278        self._action_scroll(size)279        _, maxcol = size280        visible_tickets = self.get_tickets(281            self.offset, maxcol - self.nonbody_overhead282        )283        index_highlighted = numpy.clip(284            self.index_highlighted,285            0,286            min(maxcol - self.nonbody_overhead, len(visible_tickets)) - 1287        )288        for column, _ in self.contents:289            cell_widgets = self._get_cell_widgets(290                column.key, visible_tickets, index_highlighted291            )292            # TODO: test for memory leaks293            column.body = urwid.ListBox(urwid.SimpleListWalker(cell_widgets))294    def _action_scroll(self, size, key=None):295        """296        Move highlighted index by `movement`, scroll `offset` at boundaries.297        Even if movement is 0 it is useful to refresh these values since the298        widget can be resized.299        """300        PKG_LOGGER.debug('scrolling, size={} key={}'.format(301            size, key302        ))303        _, maxcol = size304        # Map key value to scroll movement amount305        page_jump = int(self.page_speed * (maxcol - self.nonbody_overhead))306        key_movements = {307            'up': -1,308            'down': 1,309            'page up': -page_jump,310            'page down': page_jump311        }312        movement = key_movements.get(key, 0)313        # move highlighted index until boundaries314        can_move_to = numpy.clip(315            self.index_highlighted + movement,316            0,317            maxcol - self.nonbody_overhead - 1318        )319        # determine remaining movement to potentially move the offset320        movement = movement - (can_move_to - self.index_highlighted)321        self.index_highlighted = can_move_to322        # offset can't exceed ticket cache323        self.offset = numpy.clip(324            self.offset + movement,325            0,326            max(len(self._ticket_cache) - 1, 0)327        )328    def _action_open(self, *_):329        """Open view of selected ticket."""330        ticket = self._ticket_cache[self.offset + self.index_highlighted]331        PKG_LOGGER.debug('Actioning ticket id={}'.format(ticket))332        self.parent_frame.pages['TICKET_VIEW'].current_ticket = ticket333        self.parent_frame.set_page('TICKET_VIEW')334@mix_render_keypress335class TicketViewPage(urwid.ListBox, AppPageMixin):336    """An app page which displays a single ticket's information."""337    _usage = (338        u"ESC is back. "339        u"F8 exits."340    )341    _title = "Ticket View"342    def __init__(self, parent_frame, *args, **kwargs):343        """Wrap super `__init__` with extra metadata."""344        self.parent_frame = parent_frame345        self.current_ticket = None346        self.__super.__init__(urwid.SimpleListWalker(347            self.initial_row_widgets()348        ))349    def initial_row_widgets(self):350        """Initialize the row widgets to be updated later."""351        widget_list = []352        for key, meta in self.parent_frame.column_meta.items():353            field_label = meta.get('title', key.title())354            field_class = meta.get('field_class', FormFieldHorizontal)355            widget_list.append(field_class(field_label, key=key))356        return widget_list357    def refresh_widgets(self, size):358        """Refresh the row widgets."""359        ticket_dict = {}360        if self.current_ticket:361            ticket_dict = self.current_ticket.to_dict()362        for wg_field in self.body.contents:363            meta = self.parent_frame.column_meta.get(wg_field.key, {})364            _, (wg_field_value, _) = wg_field.contents365            formatter = meta.get('formatter', str)366            markup = self._get_markup(ticket_dict, wg_field.key, formatter)367            if wg_field_value.text != markup:368                wg_field_value.set_text(markup)369@mix_render_keypress370class ErrorPage(urwid.Overlay, AppPageMixin):371    """An app page which displays an error."""372    _usage = (373        u"F8 / ESC exits."374    )375    key_actions = {376        'f8': 'exit',377        'esc': 'exit',378        'ctrl c': 'exit',379    }380    def __init__(self, parent_frame, *args, **kwargs):381        """Wrap super `__init__` with extra metadata."""382        self.parent_frame = parent_frame383        self._title = kwargs.get('error_message', 'Error')384        self.error_details = kwargs.get('error_details', 'An Error occured.')385        self.__super.__init__(386            urwid.AttrWrap(387                urwid.LineBox(388                    urwid.ListBox(urwid.SimpleFocusListWalker([389                        urwid.Divider(),390                        urwid.Text(self.error_details, align='center')391                    ])),392                    title=self.page_title393                ),394                'header'395            ),396            self.parent_frame.current_page,397            align='center', width=('relative', 50),398            valign='middle', height=('relative', 50),399            min_width=24, min_height=8,400        )401    @AppPageMixin.page_title.setter402    def page_title(self, value):403        self._title = value404    def refresh_widgets(self, *_):405        _, (wg_top, _) = self.contents406        wg_title = wg_top.original_widget.title_widget407        if wg_title.text != self.page_title:408            wg_title.set_text(self.page_title)409        wg_details = wg_top.original_widget.original_widget.body[1]410        if wg_details.text != self.error_details:411            wg_details.set_text(self.error_details)412@mix_render_keypress413class WelcomePage(urwid.Overlay, AppPageMixin):414    _title = "Welcome"415    key_actions = {416        'enter': 'login'417    }418    _usage = (419        u"F8 / ESC exits."420    )421    def __init__(self, parent_frame, *args, **kwargs):422        """Wrap super `__init__` with extra metadata."""423        self.parent_frame = parent_frame424        config = self.parent_frame.config425        self.form_fields = [426            cls(label_text, getattr(config, key, ''), key=key)427            for key, (cls, label_text) in {428                'subdomain': (FormFieldHorizontalEdit, 'Subdomain: '),429                'email': (FormFieldHorizontalEdit, 'Email: '),430                'password': (FormFieldHorizontalPass, 'Password: '),431            }.items()432        ]433        widget_list = [434            urwid.Divider(),435            urwid.Text(ZENDESK_LOGO, align='center'),436            urwid.Divider(),437        ] + self.form_fields + [438            urwid.Divider(),439            urwid.Button(440                "Login", on_press=self._action_login441            )442        ]443        self.__super.__init__(444            urwid.AttrWrap(445                urwid.LineBox(446                    urwid.ListBox(urwid.SimpleFocusListWalker(447                        widget_list448                    )),449                ),450                'column_header'451            ),452            self.parent_frame.current_page,453            align='center', width=('relative', 50),454            valign='middle', height=('relative', 80),455            min_width=24, min_height=8,456        )457    def _action_login(self, *args):458        for wg_field in self.form_fields:459            value = wg_field.get_value_text()460            setattr(461                self.parent_frame.config, wg_field.key, value462            )463            if wg_field.key == 'password':464                value = "*" * len(value)465            PKG_LOGGER.info("updated config[{}] = {}".format(466                wg_field.key, value467            ))468        # The Ticket Viewer should handle the API being unavailable469        wrap_connection_error(470            functools.partial(validate_connection, self.parent_frame.config),471            attempting="Validate connection",472            on_fail=functools.partial(self.modal_fatal_error),473            on_success=functools.partial(474                PKG_LOGGER.info, "Connection validated"475            )476        )477        self.parent_frame.client = wrap_connection_error(478            functools.partial(get_client, self.parent_frame.config),479            attempting="Create client",480            on_fail=functools.partial(self.modal_fatal_error),481            on_success=functools.partial(482                PKG_LOGGER.info, "Client created"483            )484        )485        # if no error screen is showing486        if self.parent_frame.current_page_id == 'WELCOME':...user.py
Source:user.py  
...155        if 0 == self.select_table_row(self.avu_table, vm):156            self.logger.info("********** è¦åé
çèææºä¸åå¨ï¼æµè¯ç»æ! *********")157            self.send_click_closeAVU()158            self.sleep(1)159            self.driver.switch_to.parent_frame()160            self.sleep(1)161            self.driver.switch_to.parent_frame()162            self.sleep(1)163            self.send_click_closeR()164            return165        self.sleep(1)166        self.allocate_vm_user()167        self.sleep(2)168        result = self.get_element_text(self.avu_result)169        if "æå" in result:170            self.logger.info("********** ä¸ºç¨æ·åé
èææºåè½æµè¯éè¿! *********")171            self.sleep(1)172            self.send_click_submitR()173            self.sleep(1)174            self.driver.switch_to.parent_frame()175            self.sleep(1)176            self.driver.switch_to.parent_frame()177            self.sleep(1)178            self.send_click_closeR()179        else:180            self.logger.info("ä¸ºç¨æ·åé
èææºåè½æµè¯å¤±è´¥ï¼å¤±è´¥åå ï¼%s" % result)181            self.sleep(1)182            self.send_click_submitR()183            self.sleep(1)184            self.send_click_closeAVU()185            self.sleep(1)186            self.driver.switch_to.parent_frame()187            self.sleep(1)188            self.driver.switch_to.parent_frame()189            self.sleep(1)190            self.send_click_closeR()191# æµè¯ç§»é¤åé
ç»ç¨æ·çèææºåè½192    def test_remove_vm_user(self, user, vm):193        self.send_click_user()194        self.sleep(1)195        if 0 == self.send_click_allocatevm(self.table, user):196            self.logger.info("********** è¦ç§»é¤èææºæéçç¨æ·ä¸åå¨ï¼æµè¯ç»æ! *********")197            return198        self.sleep(1)199        self.driver.switch_to.frame(self.driver.find_element_by_tag_name("iframe"))200        self.sleep(1)201        if 0 == self.select_table_row(self.rvu_table, vm):202            self.logger.info("********** è¦ç§»é¤çèææºä¸åå¨ï¼æµè¯ç»æ! *********")203            self.send_click_closeRVU()204            self.sleep(1)205            self.driver.switch_to.parent_frame()206            self.sleep(1)207            self.send_click_closeR()208            return209        self.sleep(1)210        self.send_click_removevm()211        self.sleep(1)212        self.remove_vm_user()213        self.sleep(1)214        result = self.get_element_text(self.rvu_result)215        if "æå" in result:216            self.logger.info("********** ç§»é¤åé
ç»ç¨æ·çèææºåè½æµè¯éè¿! *********")217            self.sleep(1)218            self.send_click_submitR()219            self.sleep(1)220            self.driver.switch_to.parent_frame()221            self.sleep(1)222            self.send_click_closeR()223        else:224            self.logger.info("ç§»é¤åé
ç»ç¨æ·çèææºåè½æµè¯å¤±è´¥ï¼å¤±è´¥åå ï¼%s" % result)225            self.sleep(1)226            self.send_click_submitR()227            self.sleep(1)228            self.driver.switch_to.parent_frame()229            self.sleep(1)230            self.send_click_closeR()231# æµè¯ä¸ºç¨æ·ç»åé
èææºåè½232    def test_allocate_vm_group(self, group, vm):233        self.send_click_group()234        self.sleep(1)235        if 0 == self.send_click_allocatevm(self.table, group):236            self.logger.info("********** è¦åé
èææºæéçç¨æ·ç»ä¸åå¨ï¼æµè¯ç»æ! *********")237            return238        self.sleep(1)239        self.driver.switch_to.frame(self.driver.find_element_by_tag_name("iframe"))240        self.sleep(1)241        self.send_click_addvm()242        self.sleep(1)243        self.driver.switch_to.frame(self.driver.find_element_by_tag_name("iframe"))244        self.sleep(1)245        if 0 == self.select_table_row(self.avg_table, vm):246            self.logger.info("********** è¦åé
çèææºä¸åå¨ï¼æµè¯ç»æ! *********")247            self.send_click_closeAVG()248            self.sleep(1)249            self.driver.switch_to.parent_frame()250            self.sleep(1)251            self.driver.switch_to.parent_frame()252            self.sleep(1)253            self.send_click_closeR()254            return255        self.sleep(1)256        self.allocate_vm_group()257        self.sleep(2)258        result = self.get_element_text(self.avg_result)259        if "æå" in result:260            self.logger.info("********** ä¸ºç¨æ·ç»åé
èææºåè½æµè¯éè¿! *********")261            self.sleep(1)262            self.send_click_submitR()263            self.sleep(1)264            self.driver.switch_to.parent_frame()265            self.sleep(1)266            self.driver.switch_to.parent_frame()267            self.sleep(1)268            self.send_click_closeR()269        else:270            self.logger.info("ä¸ºç¨æ·ç»åé
èææºåè½æµè¯å¤±è´¥ï¼å¤±è´¥åå ï¼%s" % result)271            self.sleep(1)272            self.send_click_submitR()273            self.sleep(1)274            self.send_click_closeAVG()275            self.sleep(1)276            self.driver.switch_to.parent_frame()277            self.sleep(1)278            self.driver.switch_to.parent_frame()279            self.sleep(1)280            self.send_click_closeR()281# æµè¯ç§»é¤åé
ç»ç¨æ·ç»çèææºåè½282    def test_remove_vm_group(self, group, vm):283        self.send_click_group()284        self.sleep(1)285        if 0 == self.send_click_allocatevm(self.table, group):286            self.logger.info("********** è¦ç§»é¤èææºæéçç¨æ·ç»ä¸åå¨ï¼æµè¯ç»æ! *********")287            return288        self.sleep(1)289        self.driver.switch_to.frame(self.driver.find_element_by_tag_name("iframe"))290        self.sleep(1)291        if 0 == self.select_table_row(self.rvg_table, vm):292            self.logger.info("********** è¦ç§»é¤çèææºä¸åå¨ï¼æµè¯ç»æ! *********")293            self.send_click_closeRVG()294            self.sleep(1)295            self.driver.switch_to.parent_frame()296            self.sleep(1)297            self.send_click_closeR()298            return299        self.sleep(1)300        self.send_click_removevm()301        self.sleep(1)302        self.remove_vm_group()303        self.sleep(1)304        result = self.get_element_text(self.rvg_result)305        if "æå" in result:306            self.logger.info("********** ç§»é¤åé
ç»ç¨æ·ç»çèææºåè½æµè¯éè¿! *********")307            self.sleep(1)308            self.send_click_submitR()309            self.sleep(1)310            self.driver.switch_to.parent_frame()311            self.sleep(1)312            self.send_click_closeR()313        else:314            self.logger.info("ç§»é¤åé
ç»ç¨æ·ç»çèææºåè½æµè¯å¤±è´¥ï¼å¤±è´¥åå ï¼%s" % result)315            self.sleep(1)316            self.send_click_submitR()317            self.sleep(1)318            self.driver.switch_to.parent_frame()319            self.sleep(1)320            self.send_click_closeR()321# æµè¯ä¸ºç¨æ·ç»åé
ç¨æ·åè½322    def test_allocate_user_group(self, group, user):323        self.send_click_group()324        self.sleep(1)325        if 0 == self.send_click_allocateuser(self.table, group):326            self.logger.info("********** è¦åé
ç¨æ·çç¨æ·ç»ä¸åå¨ï¼æµè¯ç»æ! *********")327            return328        self.sleep(1)329        self.driver.switch_to.frame(self.driver.find_element_by_tag_name("iframe"))330        self.sleep(1)331        self.send_click_adduser()332        self.sleep(1)333        self.driver.switch_to.frame(self.driver.find_element_by_tag_name("iframe"))334        self.sleep(1)335        if 0 == self.select_table_row(self.aug_table, user):336            self.logger.info("********** è¦åé
çç¨æ·ä¸åå¨ï¼æµè¯ç»æ! *********")337            self.send_click_closeAUG()338            self.sleep(1)339            self.driver.switch_to.parent_frame()340            self.sleep(1)341            self.driver.switch_to.parent_frame()342            self.sleep(1)343            self.send_click_closeR()344            return345        self.sleep(1)346        self.allocate_user_group()347        self.sleep(2)348        result = self.get_element_text(self.aug_result)349        if "æå" in result:350            self.logger.info("********** ä¸ºç¨æ·ç»åé
èææºåè½æµè¯éè¿! *********")351            self.sleep(1)352            self.send_click_submitR()353            self.sleep(1)354            self.driver.switch_to.parent_frame()355            self.sleep(1)356            self.driver.switch_to.parent_frame()357            self.sleep(1)358            self.send_click_closeR()359        else:360            self.logger.info("ä¸ºç¨æ·ç»åé
èææºåè½æµè¯å¤±è´¥ï¼å¤±è´¥åå ï¼%s" % result)361            self.sleep(1)362            self.send_click_submitR()363            self.sleep(1)364            self.send_click_closeAUG()365            self.sleep(1)366            self.driver.switch_to.parent_frame()367            self.sleep(1)368            self.driver.switch_to.parent_frame()369            self.sleep(1)370            self.send_click_closeR()371# æµè¯ç§»é¤åé
ç»ç¨æ·ç»çç¨æ·372    def test_remove_user_group(self, group, user):373        self.send_click_group()374        self.sleep(1)375        if 0 == self.send_click_allocateuser(self.table, group):376            self.logger.info("********** è¦ç§»é¤ç¨æ·çç¨æ·ç»ä¸åå¨ï¼æµè¯ç»æ! *********")377            return378        self.sleep(1)379        self.driver.switch_to.frame(self.driver.find_element_by_tag_name("iframe"))380        self.sleep(1)381        if 0 == self.select_table_row(self.rug_table, user):382            self.logger.info("********** è¦ç§»é¤çç¨æ·ä¸åå¨ï¼æµè¯ç»æ! *********")383            self.send_click_closeRUG()384            self.sleep(1)385            self.driver.switch_to.parent_frame()386            self.sleep(1)387            self.send_click_closeR()388            return389        self.sleep(1)390        self.send_click_removeuser()391        self.sleep(1)392        self.remove_user_group()393        self.sleep(1)394        result = self.get_element_text(self.rug_result)395        if "æå" in result:396            self.logger.info("********** ç§»é¤åé
ç»ç¨æ·ç»çç¨æ·åè½æµè¯éè¿! *********")397            self.sleep(1)398            self.send_click_submitR()399            self.sleep(1)400            self.driver.switch_to.parent_frame()401            self.sleep(1)402            self.send_click_closeR()403        else:404            self.logger.info("ç§»é¤åé
ç»ç¨æ·ç»çç¨æ·åè½æµè¯å¤±è´¥ï¼å¤±è´¥åå ï¼%s" % result)405            self.sleep(1)406            self.send_click_submitR()407            self.sleep(1)408            self.driver.switch_to.parent_frame()409            self.sleep(1)...execution.py
Source:execution.py  
1# Copyright 2019, Offchain Labs, Inc.2# 3# Licensed under the Apache License, Version 2.0 (the "License");4# you may not use this file except in compliance with the License.5# You may obtain a copy of the License at6#7#     http://www.apache.org/licenses/LICENSE-2.08#9# Unless required by applicable law or agreed to in writing, software10# distributed under the License is distributed on an "AS IS" BASIS,11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12# See the License for the specific language governing permissions and13# limitations under the License.14from ..annotation import noreturn, modifies_stack15from .. import std16from . import call_frame17from . import os18from .. import ast19from .. import value20from .types import local_exec_state21@noreturn22def _get_call_location(vm, dispatch_func):23    # contract_id24    dispatch_func(vm)25    vm.dup0()26    vm.tnewn(0)27    vm.eq()28    vm.ifelse(lambda vm: vm.error())29    # call_location30@noreturn31def _perform_call(vm, call_num):32    # destCodePoint destId message33    os.get_chain_state(vm)34    os.chain_state.set_val("scratch")(vm)35    os.set_chain_state(vm)36    vm.push(ast.AVMLabel("evm_call_{}".format(call_num)))37    vm.swap2()38    vm.swap1()39    # contractID message ret_pc destCodePoint40    # setup call frame41    os.get_call_frame(vm)42    call_frame.spawn(vm)43    os.get_chain_state(vm)44    os.chain_state.set_val("call_frame")(vm)45    os.set_chain_state(vm)46    os.add_message_to_wallet(vm)47    _save_call_frame(vm)48    std.stack_manip.compress(vm)49    std.stack_manip.compress_aux(vm)50    # compressed_stack compressed_aux_stack51    os.get_call_frame(vm)52    call_frame.call_frame.get("parent_frame")(vm)53    call_frame.call_frame.set_val("saved_aux_stack")(vm)54    call_frame.call_frame.set_val("saved_stack")(vm)55    os.get_call_frame(vm)56    call_frame.call_frame.set_val("parent_frame")(vm)57    os.get_chain_state(vm)58    os.chain_state.set_val("call_frame")(vm)59    os.set_chain_state(vm)60    # Enter call frame61    os.get_chain_state(vm)62    os.chain_state.get("scratch")(vm)63    vm.jump()64    vm.set_label(ast.AVMLabel("evm_call_{}".format(call_num)))65    vm.auxpush()66    std.stack_manip.kill(vm)67    os.get_call_frame(vm)68    call_frame.call_frame.get("parent_frame")(vm)69    call_frame.call_frame.get("saved_stack")(vm)70    std.stack_manip.uncompress(vm)71    vm.auxpop()72    std.stack_manip.kill_aux(vm)73    os.get_call_frame(vm)74    call_frame.call_frame.get("parent_frame")(vm)75    call_frame.call_frame.get("saved_aux_stack")(vm)76    std.stack_manip.uncompress_aux(vm)77@noreturn78def setup_initial_call(vm, dispatch_func):79    # contractID message80    vm.set_exception_handler(invalid_tx)81    os.get_chain_state(vm)82    os.chain_state.get("contracts")(vm)83    call_frame.new_fresh(vm)84    os.get_chain_state(vm)85    os.chain_state.set_val("call_frame")(vm)86    os.set_chain_state(vm)87    vm.dup0()88    _get_call_location(vm, dispatch_func)89    _perform_call(vm, "initial")90    vm.clear_exception_handler()91    vm.auxpush()92    os.get_call_frame(vm)93    vm.dup0()94    call_frame.call_frame.get("parent_frame")95    call_frame.merge(vm)96    os.get_chain_state(vm)97    os.chain_state.set_val("call_frame")(vm)98    os.set_chain_state(vm)99    os.get_call_frame(vm)100    call_frame.call_frame.get("contracts")(vm)101    os.get_chain_state(vm)102    os.chain_state.set_val("contracts")(vm)103    os.set_chain_state(vm)104    os.get_call_frame(vm)105    call_frame.call_frame.get("sent_queue")(vm)106    os.send_all_in_sent_queue(vm)107    os.get_call_frame(vm)108    call_frame.call_frame.get("parent_frame")(vm)109    call_frame.call_frame.get("return_data")(vm)110    vm.auxpop()111    os.log_func_result(vm)112# [[gas, dest, value, arg offset, arg length, ret offset, ret length]]113@noreturn114def call(vm, dispatch_func, call_num, contract_id):115    std.tup.make(7)(vm)116    vm.dup0()117    os.is_simple_send(vm)118    vm.ifelse(lambda vm: [119        # call sends no gas, has no arguments, and gets no return120        os.evm_call_to_send(vm),121        os.add_send_to_queue(vm)122    ], lambda vm: [123        vm.dup0(),124        vm.tgetn(1),125        vm.push(1),126        vm.eq(),127        vm.ifelse(lambda vm: [128            os.evm_call_to_send(vm),129            vm.dup0(),130            local_exec_state.get("data")(vm),131            vm.push(0),132            vm.swap1(),133            std.sized_byterange.get(vm),134            vm.push(224),135            vm.swap1(),136            std.bitwise.shift_right(vm),137            vm.dup0(),138            vm.push(0xda795ea3),139            vm.eq(),140            vm.ifelse(lambda vm: [141                vm.pop(),142                send_erc20_interupt(vm)143            ], lambda vm: [144                vm.push(0x8e725ee1),145                vm.eq(),146                vm.ifelse(send_erc721_interupt, lambda vm: vm.error())147            ])148        ], lambda vm: [149            _inner_call(vm, dispatch_func, call_num, contract_id)150        ])151    ])152def _send_interupt(vm):153    def get_dest(vm):154        vm.push(4)155        vm.swap1()156        std.sized_byterange.get(vm)157    def get_token_type(vm):158        vm.push(36)159        vm.swap1()160        std.sized_byterange.get(vm)161    def get_token_val(vm):162        vm.push(68)163        vm.swap1()164        std.sized_byterange.get(vm)165    vm.tgetn(0)166    # data167    vm.dup0()168    get_token_val(vm)169    # val data170    vm.dup1()171    get_token_type(vm)172    # type val data173    vm.swap2()174    get_dest(vm)175    # dest val type176    vm.push(local_exec_state.make())177    vm.cast(local_exec_state.typ)178    local_exec_state.set_val("sender")(vm)179    local_exec_state.set_val("amount")(vm)180    local_exec_state.set_val("type")(vm)181def send_erc20_interupt(vm):182    _send_interupt(vm)183    vm.dup0()184    local_exec_state.get("type")(vm)185    vm.push(256)186    vm.mul()187    vm.swap1()188    local_exec_state.set_val("type")(vm)189    os.add_send_to_queue(vm)190def send_erc721_interupt(vm):191    _send_interupt(vm)192    vm.dup0()193    local_exec_state.get("type")(vm)194    vm.push(256)195    vm.mul()196    vm.push(1)197    vm.add()198    vm.swap1()199    local_exec_state.set_val("type")(vm)200    os.add_send_to_queue(vm)201@modifies_stack([value.IntType(), value.TupleType([value.IntType()]*7)], [value.IntType()])202def _mutable_call_ret(vm):203    # ret_type calltup204    translate_ret_type(vm)205    # return_val calltup206    vm.ifelse(lambda vm: [207        os.get_call_frame(vm),208        vm.dup0(),209        call_frame.call_frame.get("parent_frame")(vm),210        call_frame.merge(vm),211        # parent_frame212        os.get_chain_state(vm),213        os.chain_state.set_val("call_frame")(vm),214        os.set_chain_state(vm),215        vm.push(1),216    ], lambda vm: [217        os.get_call_frame(vm),218        call_frame.call_frame.get("parent_frame")(vm),219        os.get_chain_state(vm),220        os.chain_state.set_val("call_frame")(vm),221        os.set_chain_state(vm),222        vm.push(0)223    ])224    vm.swap1()225    os.copy_return_data(vm)226@modifies_stack([], [])227def _save_call_frame(vm):228    os.get_call_frame(vm)229    call_frame.save_state(vm)230    os.get_chain_state(vm)231    os.chain_state.set_val("call_frame")(vm)232    os.set_chain_state(vm)233# [[gas, dest, value, arg offset, arg length, ret offset, ret length]]234@noreturn235def _inner_call(vm, dispatch_func, call_num, contract_id):236    vm.dup0()237    os.evm_call_to_send(vm)238    # msg239    vm.dup0()240    vm.tgetn(1)241    # contractId msg242    vm.swap1()243    vm.push(contract_id)244    vm.swap1()245    vm.tsetn(1)246    vm.swap1()247    # destID msg248    _save_call_frame(vm)249    vm.dup0()250    _get_call_location(vm, dispatch_func)251    _perform_call(vm, call_num)252    _mutable_call_ret(vm)253# [gas, dest, value, arg offset, arg length, ret offset, ret length]254@noreturn255def callcode(vm, dispatch_func, call_num, contract_id):256    std.tup.make(7)(vm)257    # calltup258    vm.dup0()259    os.evm_call_to_send(vm)260    # msg calltup261    vm.dup0()262    vm.tgetn(1)263    _get_call_location(vm, dispatch_func)264    # destCodePoint msg calltup265    vm.swap1()266    vm.push(contract_id)267    vm.swap1()268    vm.tsetn(1)269    # msg destCodePoint calltup270    vm.push(contract_id)271    vm.swap1()272    vm.swap2()273    # destCodePoint destId message calltup274    _save_call_frame(vm)275    _perform_call(vm, call_num)276    _mutable_call_ret(vm)277# [gas, dest, arg offset, arg length, ret offset, ret length]278@noreturn279def delegatecall(vm, dispatch_func, call_num, contract_id):280    os.message_value(vm)281    # value, gas, dest282    vm.swap2()283    vm.swap1()284    # gas, dest, value285    std.tup.make(7)(vm)286    # calltup287    vm.dup0()288    os.evm_call_to_send(vm)289    # msg calltup290    vm.dup0()291    vm.tgetn(1)292    _get_call_location(vm, dispatch_func)293    # destCodePoint msg calltup294    vm.swap1()295    os.message_caller(vm)296    vm.swap1()297    vm.tsetn(1)298    # msg destCodePoint calltup299    vm.push(contract_id)300    vm.swap1()301    vm.swap2()302    # destCodePoint destId message calltup303    _save_call_frame(vm)304    _perform_call(vm, call_num)305    _mutable_call_ret(vm)306# [[gas, dest, value, arg offset, arg length, ret offset, ret length]]307@noreturn308def staticcall(vm, dispatch_func, call_num, contract_id):309    vm.push(0)310    # value, gas, dest311    vm.swap2()312    vm.swap1()313    # gas, dest, value314    std.tup.make(7)(vm)315    # calltup316    vm.dup0()317    os.evm_call_to_send(vm)318    # msg calltup319    vm.dup0()320    vm.tgetn(1)321    # contractId msg calltup322    vm.swap1()323    vm.push(contract_id)324    vm.swap1()325    vm.tsetn(1)  # update the sender to this contract326    vm.swap1()327    # contractId msg calltup328    _save_call_frame(vm)329    # contractId msg calltup330    vm.dup0()331    _get_call_location(vm, dispatch_func)332    _perform_call(vm, "static_{}".format(call_num))333    translate_ret_type(vm)334    # ret calltup335    vm.swap1()336    os.get_call_frame(vm)337    call_frame.call_frame.get("parent_frame")(vm)338    os.get_chain_state(vm)339    os.chain_state.set_val("call_frame")(vm)340    os.set_chain_state(vm)341    # calltup ret342    os.copy_return_data(vm)343@noreturn344def selfdestruct(vm):345    os.get_call_frame(vm)346    call_frame.call_frame.get("sent_queue")(vm)347    # send waiting messages348    os.send_all_in_sent_queue(vm)349    vm.pop()  # address to transfer all funds to350    vm.halt()351# [offset, length]352@noreturn353def ret(vm):354    vm.dup1()355    vm.swap1()356    os.get_mem_segment(vm)357    std.tup.make(2)(vm)358    # return_data359    os.get_call_frame(vm)360    vm.dup0()361    call_frame.call_frame.get("parent_frame")(vm)362    # parent_frame current_frame return_data363    vm.swap1()364    vm.swap2()365    # return_data parent_frame current_frame366    vm.swap1()367    call_frame.call_frame.set_val("return_data")(vm)368    # parent_frame current_frame369    vm.swap1()370    call_frame.call_frame.set_val("parent_frame")(vm)371    vm.dup0()372    call_frame.call_frame.get("return_location")(vm)373    vm.swap1()374    os.get_chain_state(vm)375    os.chain_state.set_val("call_frame")(vm)376    os.set_chain_state(vm)377    vm.push(2)378    vm.swap1()379    vm.jump()380@noreturn381def stop(vm):382    os.get_call_frame(vm)383    vm.dup0()384    call_frame.call_frame.get("parent_frame")(vm)385    # parent_frame current_frame386    std.sized_byterange.new(vm)387    vm.swap1()388    call_frame.call_frame.set_val("return_data")(vm)389    vm.swap1()390    call_frame.call_frame.set_val("parent_frame")(vm)391    # call_frame392    vm.dup0()393    call_frame.call_frame.get("return_location")(vm)394    # return_location call_frame395    vm.swap1()396    os.get_chain_state(vm)397    os.chain_state.set_val("call_frame")(vm)398    os.set_chain_state(vm)399    vm.push(3)400    vm.swap1()401    vm.jump()402# [memory offset, memory length]403@noreturn404def revert(vm):405    vm.dup1()406    vm.swap1()407    os.get_mem_segment(vm)408    std.tup.make(2)(vm)409    # return_data410    os.get_call_frame(vm)411    vm.dup0()412    call_frame.call_frame.get("parent_frame")(vm)413    # parent_frame current_frame return_data414    vm.swap1()415    vm.swap2()416    # return_data parent_frame current_frame417    vm.swap1()418    call_frame.call_frame.set_val("return_data")(vm)419    # parent_frame current_frame420    vm.swap1()421    call_frame.call_frame.set_val("parent_frame")(vm)422    vm.dup0()423    call_frame.call_frame.get("return_location")(vm)424    vm.swap1()425    os.get_chain_state(vm)426    os.chain_state.set_val("call_frame")(vm)427    os.set_chain_state(vm)428    vm.push(0)429    vm.swap1()430    vm.jump()431# []432@noreturn433def invalid_tx(vm):434    os.get_call_frame(vm)435    vm.dup0()436    call_frame.call_frame.get("parent_frame")(vm)437    # parent_frame current_frame438    std.sized_byterange.new(vm)439    vm.swap1()440    call_frame.call_frame.set_val("return_data")(vm)441    vm.swap1()442    call_frame.call_frame.set_val("parent_frame")(vm)443    # call_frame444    vm.dup0()445    call_frame.call_frame.get("return_location")(vm)446    # return_location call_frame447    vm.swap1()448    os.get_chain_state(vm)449    os.chain_state.set_val("call_frame")(vm)450    os.set_chain_state(vm)451    vm.push(1)452    vm.swap1()453    vm.jump()454@modifies_stack([value.IntType()], [value.IntType()])455def translate_ret_type(vm):456    vm.push(1)...chose_variables.py
Source:chose_variables.py  
1from tkinter import *2from views import simulation_view3from constants import constants456class chose_variables:78    WINDOW_WIDTH = 4009    WINDOW_HEIGHT = 2001011    BUTTON_BG = "dark grey"1213    DEFAULT_MAX_CIRCLES = 30014    DEFAULT_CIRCLE_SIZE = 101516    DEFAULT_MIN_SPEED = 117    DEFAULT_MAX_SPEED = 51819    DEFAULT_CHANCE_OF_CHANGING_DIRECTION = 0.0520    DEFAULT_CHANCE_OF_CHANGING_SPEED = 0.32122    DEFAULT_NUMBER_OF_INFECTED_AT_START = 223    DEFAULT_MAX_DISTANCE_FOR_INFECTION = 1024    DEFAULT_MAX_INFECTION_TIME = 1025    DEFAULT_INFECTION_PROBABILITY = 0.52627    DEFAULT_TIME = 602829    entry = []3031    def __init__(self):3233        root = Tk()34        self.setup_root(root)35        self.setup_views(root)36        root.mainloop()373839    def setup_views(self, root):40        self.setup_main_frame_components(root)414243    def setup_root(self, root):44        root.title("Virus Simulator")45        root.configure(background=constants.FRAME_BG)46        self.center_window(root)474849    def center_window(self, root):50        screen_width = root.winfo_screenwidth()51        screen_height = root.winfo_screenheight()52        x_location = int(screen_width/2 - self.WINDOW_WIDTH/2)53        y_location = int(screen_height/2 - self.WINDOW_HEIGHT/2)54        root.geometry('{}x{}+{}+{}'.format(self.WINDOW_WIDTH, self.WINDOW_HEIGHT, x_location, y_location))555657    def setup_main_frame_components(self, root):58        circle_frame = self.setup_circle_components(root)59        infection_frame = self.setup_infection_components(root)6061        circle_frame.pack(side=LEFT, padx=1, pady=10)62        infection_frame.pack(side=RIGHT, padx=1, pady=10)6364        start_button = Button(root, text="Start",bg=constants.FRAME_BG, command=lambda:self.go_to_simulation(root))65        start_button.pack(side=BOTTOM, padx=1, pady=10)66676869    def setup_circle_components(self, root):70        circle_frame = self.create_frame(root, constants.FRAME_BG)71        self.setup_circle_amount_components(circle_frame)72        self.setup_circle_size_components(circle_frame)73        self.setup_circle_min_speed_components(circle_frame)74        self.setup_circle_max_speed_components(circle_frame)75        self.setup_circle_chance_of_changing_direction_components(circle_frame)76        self.setup_circle_chance_of_changing_speed_components(circle_frame)77        return circle_frame787980    def setup_circle_amount_components(self, circle_frame):81        self.max_circles_entry = StringVar(circle_frame, self.DEFAULT_MAX_CIRCLES)82        self.create_frame_for_components(circle_frame,83                                         "Number of Objects",84                                         constants.FRAME_BG,85                                         self.max_circles_entry,86                                         5,87                                         NORMAL)888990    def setup_circle_size_components(self, circle_frame):91        self.circle_size_entry = StringVar(circle_frame, self.DEFAULT_CIRCLE_SIZE)92        self.create_frame_for_components(circle_frame,93                                         "Size of Objects",94                                         constants.FRAME_BG,95                                         self.circle_size_entry,96                                         5,97                                         NORMAL)9899100    def setup_circle_min_speed_components(self, parent_frame):101        self.min_speed_entry = StringVar(parent_frame, self.DEFAULT_MIN_SPEED)102        self.create_frame_for_components(parent_frame,103                                         "Minimum speed",104                                         constants.FRAME_BG,105                                         self.min_speed_entry,106                                         5,107                                         NORMAL)108109110    def setup_circle_max_speed_components(self, parent_frame):111        self.max_speed_entry = StringVar(parent_frame, self.DEFAULT_MAX_SPEED)112        self.create_frame_for_components(parent_frame,113                                         "Maximum speed",114                                         constants.FRAME_BG,115                                         self.max_speed_entry,116                                         5,117                                         NORMAL)118119120    def setup_circle_chance_of_changing_direction_components(self, parent_frame):121        self.chance_of_changing_direction_entry = StringVar(parent_frame, self.DEFAULT_CHANCE_OF_CHANGING_DIRECTION)122        self.create_frame_for_components(parent_frame,123                                         "Direction change probability",124                                         constants.FRAME_BG,125                                         self.chance_of_changing_direction_entry,126                                         5,127                                         DISABLED)128129130    def setup_circle_chance_of_changing_speed_components(self, parent_frame):131        self.chance_of_changing_speed_entry = StringVar(parent_frame, self.DEFAULT_CHANCE_OF_CHANGING_SPEED)132        self.create_frame_for_components(parent_frame,133                                         "Speed change probability",134                                         constants.FRAME_BG,135                                         self.chance_of_changing_speed_entry,136                                         5,137                                         DISABLED)138139140    def setup_infection_components(self, root):141        infection_frame = self.create_frame(root, constants.FRAME_BG)142        self.setup_number_of_infected(infection_frame)143        self.setup_max_distance_for_infection(infection_frame)144        self.setup_max_infection_time(infection_frame)145        self.setup_infection_probability(infection_frame)146        self.setup_time(infection_frame)147        return infection_frame148149150    def setup_number_of_infected(self, parent_frame):151        self.number_of_infected_at_start_entry = StringVar(parent_frame, self.DEFAULT_NUMBER_OF_INFECTED_AT_START)152        self.create_frame_for_components(parent_frame,153                                         "Infected object at start",154                                         constants.FRAME_BG,155                                         self.number_of_infected_at_start_entry,156                                         5,157                                         NORMAL)158159160    def setup_max_distance_for_infection(self, parent_frame):161        self.max_distance_for_infection_entry = StringVar(parent_frame, self.DEFAULT_MAX_DISTANCE_FOR_INFECTION)162        self.create_frame_for_components(parent_frame,163                                         "Infected max distance",164                                         constants.FRAME_BG,165                                         self.max_distance_for_infection_entry,166                                         5,167                                         NORMAL)168169170    def setup_max_infection_time(self, parent_frame):171        self.max_infection_time_entry = StringVar(parent_frame, self.DEFAULT_MAX_INFECTION_TIME)172        self.create_frame_for_components(parent_frame,173                                         "Infection time (s)",174                                         constants.FRAME_BG,175                                         self.max_infection_time_entry,176                                         5,177                                         NORMAL)178179180    def setup_infection_probability(self, parent_frame):181        self.infection_probability_entry = StringVar(parent_frame, self.DEFAULT_INFECTION_PROBABILITY)182        self.create_frame_for_components(parent_frame,183                                         "Infection probability",184                                         constants.FRAME_BG,185                                         self.infection_probability_entry,186                                         5,187                                         NORMAL)188189    def setup_time(self, parent_frame):190        self.time_entry = StringVar(parent_frame, self.DEFAULT_TIME)191        self.create_frame_for_components(parent_frame,192                                         "Time (s)",193                                         constants.FRAME_BG,194                                         self.time_entry,195                                         5,196                                         NORMAL)197198199    def create_frame_for_components(self, parent_frame, text, bg, entry_reference, entry_size, state):200        new_frame = self.create_label_and_input_frame(parent_frame, text, bg, entry_reference, entry_size, state)201        new_frame.pack()202203204    def create_label_and_input_frame(self, parent_frame, label_text, bg, entry_reference, entry_width, entry_state):205        new_frame = self.create_frame(parent_frame, bg)206        new_frame.pack()207208        new_label = self.create_label(new_frame, label_text, bg)209        new_label.pack(side=LEFT)210211        entry = self.create_entry_box(new_frame, entry_reference, entry_width, state=entry_state)212        entry.pack(side=LEFT)213214        return new_frame215216217    def create_frame(self, parent_frame, bg):218        return Frame(parent_frame, bg=bg)219220221    def create_label(self, parent_frame, text, bg):222        return Label(parent_frame, text=text, bg=bg)223224225    def create_entry_box(self, parent_frame, entry_reference, entry_width, state):226        return Entry(parent_frame, width=entry_width, textvariable=entry_reference, state=state)227228229    def get_entry(self):230        self.entry.append([constants.MAX_CIRCLES_STRING, self.max_circles_entry.get()])231        self.entry.append([constants.CIRCLE_SIZE_STRING, self.circle_size_entry.get()])232        self.entry.append([constants.MIN_SPEED_STRING, self.min_speed_entry.get()])233        self.entry.append([constants.MAX_SPEED_STRING, self.max_speed_entry.get()])234        self.entry.append([constants.CHANCE_OF_CHANGING_DIRECTION_STRING, self.chance_of_changing_direction_entry.get()])235        self.entry.append([constants.CHANCE_OF_CHANGING_SPEED_STRING, self.chance_of_changing_speed_entry.get()])236        self.entry.append([constants.NUMBER_OF_INFECTED_AT_START_STRING, self.number_of_infected_at_start_entry.get()])237        self.entry.append([constants.MAX_DISTANCE_FOR_INFECTION_STRING, self.max_distance_for_infection_entry.get()])238        self.entry.append([constants.MAX_INFECTION_TIME_STRING, self.max_infection_time_entry.get()])239        self.entry.append([constants.INFECTION_PROBABILITY_STRING, self.infection_probability_entry.get()])240        self.entry.append([constants.TIME_STRING, self.time_entry.get()])241242243    def go_to_simulation(self, root):244        root.destroy()245        self.get_entry()
...LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
