Beispiel #1
0
 def secrets(self):
     if self._secrets is None:
         data = Secrets('sync-server-ngrok').value_from_json_string()
         username = data.get('username')
         password = data.get('password')
         self._secrets = (username, password)
     return self._secrets
Beispiel #2
0
 def setup(self):
     if self.secrets_id is None:
         raise Exception('in Web_Slack no slack team provided')
     self.page           = Browser_Page(headless = self.headless, new_page=self.new_page).setup()
     self.server_details = Secrets(self.secrets_id).value_from_json_string()
     self.server_url     = self.server_details.get('server')
     return self
Beispiel #3
0
    def setup(self):

        self.page = Browser_Page(headless=self.headless,
                                 new_page=self.new_page).setup()
        self.server_details = Secrets(self.secrets_id).value_from_json_string()
        self.server_url = self.server_details.get('server')

        self.page.on_dialog__always_accept()
        #self.page.on_request__block_these(['glasswall.atlassian.net','jeditor','tinymce'])
        return self
Beispiel #4
0
    def test_create_secret(self):
        import json
        from osbot_aws.apis.Secrets import Secrets
        data = {
            "email": "..",
            "password": "******",
            "server": "https://os-summit.slack.com"
        }

        Secrets('gs_bot_slack_web_oss').create(json.dumps(data))
        self.result = Secrets('gs_bot_slack_web_oss').value_from_json_string()
Beispiel #5
0
    async def test_open_jira_page(self):
        from osbot_aws.apis.Secrets import Secrets
        self.api = API_Browser(headless=False)

        login_needed = False
        self.secrets_id = 'GS_BOT_GS_JIRA'

        (server, username, password) = Secrets(
            self.secrets_id).value_from_json_string().values()

        if login_needed:
            Dev.pprint(server, username, password)
            await self.api.open(server + '/login.jsp')
            page = await self.api.page()
            await page.type('#login-form-username', username)
            await page.type('#login-form-password', password)
            await page.click('#login-form-submit')

        #await self.api.open(server + '/browse/GSP-95')
        #page = await self.api.page()
        #await self.api.js_execute("$('#show-more-links-link').click()")
        #from time import sleep
        #sleep(1)
        await self.api.page_size(2000, 3000)

        await self.api.screenshot(
            file_screenshot='/tmp/tmp-jira-screenshot.png', full_page=True)
Beispiel #6
0
    def test_exists(self):
        assert Secrets('aaaaa').exists() is False
        self.secrets.undelete()
        assert self.secrets.exists() is True

        self.secrets.delete()
        assert self.secrets.exists() is False
def run(event, context):

    channel = event.get('channel')
    png_data = event.get('png_data')
    s3_bucket = event.get('s3_bucket')
    s3_key = event.get('s3_key')
    title = event.get('title')
    team_id = event.get('team_id')
    #aws_secrets_id  = event.get('aws_secrets_id')
    #if  team_id == 'T7F3AUXGV': aws_secrets_id = 'slack-gs-bot'             # hard coded values
    #if  team_id == 'T0SDK1RA8': aws_secrets_id = 'slack-gsbot-for-pbx'      # need to move to special function
    aws_secrets_id = 'slack-bot-oauth'
    bot_token = Secrets(aws_secrets_id).value()

    if png_data:
        #(fd, tmp_file) = tempfile.mkstemp('png')
        tmp_file = Files.temp_file('.png')
        with open(tmp_file, "wb") as fh:
            fh.write(base64.decodebytes(png_data.encode()))
    else:
        if s3_bucket and s3_key:
            tmp_file = S3().file_download_and_delete(s3_bucket, s3_key)
        else:
            return None

    return send_file_to_slack(tmp_file, title, bot_token, channel)
Beispiel #8
0
    def start_build_for_repo(self,
                             repo_name,
                             user='******',
                             server_size='small'):
        aws_secret = "git__{0}".format(repo_name)

        data = Secrets(aws_secret).value_from_json_string()
        if not data:
            return None
        repo_url = data['repo_url']

        kvargs = {
            'projectName':
            self.project_name,
            'timeoutInMinutesOverride':
            self.build_timeout,
            'sourceLocationOverride':
            repo_url,
            'computeTypeOverride':
            self.server_sizes[server_size],
            'environmentVariablesOverride': [{
                'name': 'repo_name',
                'value': repo_name,
                'type': 'PLAINTEXT'
            }, {
                'name': 'user',
                'value': user,
                'type': 'PLAINTEXT'
            }]
        }
        build_id = self.code_build.codebuild.start_build(
            **kvargs).get('build').get('arn')
        return {'status': 'ok', 'data': build_id}
Beispiel #9
0
 def setup(self):
     login_details   = json.loads(Secrets(self.aws_secrets_id).value())
     self.username   = login_details.get('username')
     self.password   = login_details.get('password')
     self.server_url = login_details.get('server_url')
     if self._browser is None:
         self._browser = API_Browser(headless=self.headless).sync__setup_browser()
     return self._browser
Beispiel #10
0
 def _setup_Elastic_on_cloud_via_AWS_Secret(self, index, secret_id):
     credentials = json.loads(Secrets(secret_id).value())
     host = credentials['host']
     username = credentials['username']
     password = credentials['password']
     port = credentials['port']
     self.index = index
     self._setup_Elastic_on_cloud(host, port, username, password)
     return self
    def setup(self):

        if self.elastic is None:
            credentials = json.loads(Secrets(self.secrets_id).value())
            host        = credentials['host']
            username    = credentials['username']
            password    = credentials['password']
            port        = credentials['port']
            self.elastic = Elastic_Search(self.index_id)._setup_Elastic_on_cloud(host, port, username, password)

        return self
def upload_png_file(channel_id, file):
    bot_token = Secrets('slack-gs-bot').value()
    my_file = {'file': ('/tmp/myfile.pdf', open(file, 'rb'), 'png')}

    payload = {
        "filename": 'image.png',
        "token": bot_token,
        "channels": [channel_id],
    }
    requests.post("https://slack.com/api/files.upload",
                  params=payload,
                  files=my_file)

    return 'image sent .... '
Beispiel #13
0
    def login(self):

        (account_id, username, password) = Secrets(
            self.secrets_id).value_from_json_string().values()
        login_url = f'https://{account_id}.signin.aws.amazon.com/console'

        self.page.open(login_url)
        self.page.wait_for_element__id('username')
        js_code = f"""
                        $('#username').val('');
                        $('#password').val('');                        
                   """
        self.js_invoke(js_code)  # this clears the values
        self.page.type('#username',
                       username)  # this triggers the js events required
        self.page.type('#password', password)
        self.page.click('#signin_button')  # this submits the form
        self.wait(2)
Beispiel #14
0
 def test_access_to_aws_secrets(self):
     secret_name = f'ssh_key_{self.key_name}.pem'
     assert len(Secrets('').list()) > 0
     assert Secrets(secret_name).exists() is True
Beispiel #15
0
 def jira_server_details(self):
     data = Secrets(self.secrets_id).value_from_json_string()
     server = data.get('server')
     username = data.get('username')
     password = data.get('password')
     return server, username, password
Beispiel #16
0
class Web_Slack:
    def __init__(self, team_id, headless=True, new_page=True):
        self._browser               = None
        self._browser_helper        = None
        self.scroll_split           = 1500
        self.server_details         = None
        self.server_url             = None
        self.team_id                = team_id
        self.secrets_id             = self.resolve_secret_id()
        self.headless               = headless
        self.new_page               = new_page
        self.page : Browser_Page    = None


    def resolve_secret_id(self):
        if self.team_id == 'T7F3AUXGV' : return 'gs_bot_slack_web'
        if self.team_id == 'TAULHPATC' : return 'gs_bot_slack_web_oss'

    def setup(self):
        if self.secrets_id is None:
            raise Exception('in Web_Slack no slack team provided')
        self.page           = Browser_Page(headless = self.headless, new_page=self.new_page).setup()
        self.server_details = Secrets(self.secrets_id).value_from_json_string()
        self.server_url     = self.server_details.get('server')
        return self

    def js_invoke(self,js_code):
        return self.page.javascript_eval(js_code)

    def login(self,wait_for_load=False):
        path = '/'
        self.open(path)

        page_text = self.page.text()

        if "Sign in to" in page_text:
            email = self.server_details.get('email')
            password = self.server_details.get('password')
            js_code = """
                          $('#email').val('{0}');
                          $('#password').val('{1}');
                          $('#signin_btn').click();
            """.format(email,password)
            self.page.javascript_eval(js_code)
            if wait_for_load:
                self.page.wait_for_element__id('msg_input')
                self.page.wait_for_element__id('loading_welcome_msg', exists=False)


            # misc tests to find optimal elements to wait
            #for i in range(0,3):
                #self.page.wait_for_element__id        ('msg_input'                                         )
                #self.page.wait_for_element__id        ('msg_input'          , max_attempts=4,exists=False )
                #self.page.wait_for_element__id        ('loading_welcome_msg', max_attempts=4, exists=True)
                #self.page.wait_for_element__id        ('loading_welcome_msg', max_attempts=4, exists=False)
                #self.page.wait_for_element__class_name('c-message__body'     , max_attempts=4, exists=True)
                #self.page.wait_for_element__class_name('c-message__body'     , max_attempts=4, exists=False)
                #self.page.wait_for_element__tag_name  ('button'              , max_attempts=4, exists=True)
                #self.page.wait_for_element__tag_name  ('button'              , max_attempts=4, exists=False)

                #print('****')



    def logout(self):
        logout_link_path_1 = "$('.ts_icon_sign_out').parent().parent().find('a').attr('href')"
        logout_link_path_2 = "$('#team_menu_user').click(); $('#logout a').attr('href')"
        logout_link      = self.page.javascript_eval(logout_link_path_1)
        if logout_link is None:
            logout_link = self.page.javascript_eval(logout_link_path_2)
        if logout_link and logout_link.startswith('https://slack.com/signout'):
            self.page.open(logout_link)
        else:
            print("didn't find logout link")
        return self

    def open(self, path=None):
        if path is None:
            path = ''
        url = "{0}{1}".format(self.server_url, path)

        page = self.page.open(url)
        self.page.wait_for_element__id('loading_welcome_msg', exists=False)
        return page

    def wait(self,seconds):
        self.page.wait(seconds)
        return self

    def screenshot(self,width=None):
        if width:
            self.page.width(width)
        return self.page.screenshot()

    def set_browser_size(self,width, height):
        self.page.width(width, height)
        return self

    def fix_set_list_view(self):
        self.open('/issues/?filter=-1')
        self.page.javascript_eval("$('.aui-list-item-link').eq(1).click()")
        return self

    def fix_ui_for_screenshot(self):
        js_code = """
                        $('.client_channels_list_container').hide();
        """
        self.page.javascript_eval(js_code)
        return self

    def scroll_messages_by(self,value):
        value = Misc.to_int(value)
        if value:
            # split the scroll in chunks since it was not working as expected when the
            # scroll amount was bigger than the current browser page window height
            while value > 0:
                if value < self.scroll_split:
                    scroll_by = value
                else:
                    scroll_by = self.scroll_split
                value -= scroll_by
                js_code = """value = $('.c-scrollbar__hider').eq(1).scrollTop() - {0} ;
                             $('.c-scrollbar__hider').eq(1).scrollTop(value);""".format(scroll_by)
                self.js_invoke(js_code)
                self.wait(0.25)             # wait a little bit before sending the next scroll event (this needs a better solution)

        return self
def resolve_bot_token(team_id):                                                # to refactor
    if team_id == '...':    return Secrets('slack-gs-bot'       ).value()
    if team_id == '...':    return Secrets('slack-gsbot-for-pbx').value()

    return Secrets('slack-gs-bot').value()
Beispiel #18
0
 def config(self):
     if self._config is None:
         data = Secrets(self.secrets_id).value_from_json_string()
         self._config = (data.get('server'), data.get('username'),
                         data.get('password'))
     return self._config
 def repo_url(self):
     data = Secrets(self.aws_secret).value_from_json_string()
     return 'https://{0}:{1}@github.com/{2}/{3}.git'.format(
         data.get('username'), data.get('password'), data.get('git_org'),
         self.repo_name)
Beispiel #20
0
 def get_lambda_shell_auth(self):
     data = Secrets(self.secret_id).value_from_json_string()
     if data:
         return data.get('key')
Beispiel #21
0
 def test_delete(self):
     self.secrets.delete()
     assert self.secrets.deleted() is True
     assert Secrets('aaaa').deleted() is False
Beispiel #22
0
 def reset_lambda_shell_auth(self):
     value = {'key' : random_uuid() }
     return Secrets(self.secret_id).update_to_json_string(value)
Beispiel #23
0
 def setUp(self):
     self.id = 'an_secret'
     self.value = 'goes here'
     self.secrets = Secrets(self.id)
     if self.secrets.deleted():
         self.secrets.undelete()
Beispiel #24
0
class test_Secrets(TestCase):
    def setUp(self):
        self.id = 'an_secret'
        self.value = 'goes here'
        self.secrets = Secrets(self.id)
        if self.secrets.deleted():
            self.secrets.undelete()

    def tearDown(self):
        if self.secrets.deleted() is False and self.secrets.exists():
            assert self.secrets.delete() is True

    def test_create(self):
        #if self.secrets.exists() or self.secrets.deleted():
        assert self.secrets.delete_no_recovery() is True

        #assert self.secrets.create(self.value) is True

    def test_delete(self):
        self.secrets.delete()
        assert self.secrets.deleted() is True
        assert Secrets('aaaa').deleted() is False

    def test_details(self):
        details = self.secrets.details()
        assert details.get('Name') == self.id
        assert self.secrets.set_id('aaaaaa').details() is None

    def test_exists(self):
        assert Secrets('aaaaa').exists() is False
        self.secrets.undelete()
        assert self.secrets.exists() is True

        self.secrets.delete()
        assert self.secrets.exists() is False

    def test_print(self, ):
        def my_print(value):  # hook method
            assert "{'ARN': 'arn:aws:secretsmanager:" in value  # confirm data sent to print
            assert "'Name': 'an_secret'" in value
            assert "'ResponseMetadata': {'HTTPHeader" in value

        import builtins  # get print module
        original_print = builtins.print  # save original print method
        builtins.print = my_print  # apply hook
        self.secrets.print()  # call function that will call print
        builtins.print = original_print  # restore original print

    def test_update_to_json_string(self):
        data = {
            'the answer is': 42,
            'random_string': Misc.random_string_and_numbers()
        }
        self.secrets.update_to_json_string(data)
        assert self.secrets.value_from_json_string() == data

    def test_value(self):
        temp_value = Misc.random_string_and_numbers()
        self.secrets.update(temp_value)
        assert self.secrets.value() == temp_value

        assert self.secrets.set_id('abcd').value() is None

    # bugs

    def test_bug__delete_no_recovery__is_not_deleting_it_strait_away(self):
        assert self.secrets.exists() is True  # confirm secret exists
        assert self.secrets.delete_no_recovery(
        ) is True  # this should delete immediately
        assert self.secrets.exists() is False  # confirm secret doesn't exist
        assert self.secrets.deleted(
        ) is True  # (bug) confirm is marked for deletion (vs already deleted)
        assert self.secrets.create(
            'abc'
        ) is False  # (bug) confirm we can't create a new one with same name
Beispiel #25
0
class Web_Slack:
    def __init__(self, team_id, headless=True, new_page=True):
        self._browser = None
        self._browser_helper = None
        self.server_details = None
        self.server_url = None
        self.team_id = team_id
        self.secrets_id = self.resolve_secret_id()
        self.headless = headless
        self.new_page = new_page
        self.page: Browser_Page = None

    def resolve_secret_id(self):
        if self.team_id == 'T7F3AUXGV': return 'gs_bot_slack_web'
        if self.team_id == 'TAULHPATC': return 'gs_bot_slack_web_oss'

    def setup(self):
        if self.secrets_id is None:
            raise Exception('in Web_Slack no slack team provided')
        self.page = Browser_Page(headless=self.headless,
                                 new_page=self.new_page).setup()
        self.server_details = Secrets(self.secrets_id).value_from_json_string()
        self.server_url = self.server_details.get('server')
        return self

    def channel(self, issue_id):
        raise Exception('to do')
        #return self

    def login(self, wait_for_load=False):
        path = '/'
        self.open(path)

        page_text = self.page.text()

        if "Sign in to" in page_text:
            email = self.server_details.get('email')
            password = self.server_details.get('password')
            js_code = """
                          $('#email').val('{0}');
                          $('#password').val('{1}');
                          $('#signin_btn').click();
            """.format(email, password)
            self.page.javascript_eval(js_code)
            if wait_for_load:
                self.page.wait_for_element__id('msg_input')
                self.page.wait_for_element__id('loading_welcome_msg',
                                               exists=False)

            # misc tests to find optimal elements to wait
            #for i in range(0,3):
            #self.page.wait_for_element__id        ('msg_input'                                         )
            #self.page.wait_for_element__id        ('msg_input'          , max_attempts=4,exists=False )
            #self.page.wait_for_element__id        ('loading_welcome_msg', max_attempts=4, exists=True)
            #self.page.wait_for_element__id        ('loading_welcome_msg', max_attempts=4, exists=False)
            #self.page.wait_for_element__class_name('c-message__body'     , max_attempts=4, exists=True)
            #self.page.wait_for_element__class_name('c-message__body'     , max_attempts=4, exists=False)
            #self.page.wait_for_element__tag_name  ('button'              , max_attempts=4, exists=True)
            #self.page.wait_for_element__tag_name  ('button'              , max_attempts=4, exists=False)

            #print('****')

    def logout(self):
        logout_link_path_1 = "$('.ts_icon_sign_out').parent().parent().find('a').attr('href')"
        logout_link_path_2 = "$('#team_menu_user').click(); $('#logout a').attr('href')"
        logout_link = self.page.javascript_eval(logout_link_path_1)
        if logout_link is None:
            logout_link = self.page.javascript_eval(logout_link_path_2)
        if logout_link and logout_link.startswith('https://slack.com/signout'):
            self.page.open(logout_link)
        else:
            print("didn't find logout link")
        return self

    def open(self, path=None):
        if path is None:
            path = ''
        url = "{0}{1}".format(self.server_url, path)

        page = self.page.open(url)
        self.page.wait_for_element__id('loading_welcome_msg', exists=False)
        return page

    def wait(self, seconds):
        self.page.wait(seconds)
        return self

    def screenshot(self, width=None):
        if width:
            self.page.width(width)
        return self.page.screenshot()

    def fix_set_list_view(self):
        self.open('/issues/?filter=-1')
        self.page.javascript_eval("$('.aui-list-item-link').eq(1).click()")
        return self

    def fix_ui_for_screenshot(self):
        js_code = """
                        $('.client_channels_list_container').hide();
        """
        self.page.javascript_eval(js_code)
        return self
Beispiel #26
0
class Web_Jira:
    def __init__(self, headless=True, new_page=True):
        self._browser = None
        self._browser_helper = None
        self.server_details = None
        self.server_url = None
        self.secrets_id = 'GS_BOT_GS_JIRA'
        self.headless = headless
        self.new_page = new_page
        self.page: Browser_Page = None

    def setup(self):
        self.page = Browser_Page(headless=self.headless,
                                 new_page=self.new_page).setup()
        self.server_details = Secrets(self.secrets_id).value_from_json_string()
        self.server_url = self.server_details.get('server')

        self.page.on_dialog__always_accept()
        self.page.on_request__block_these(
            ['jira.photobox.com', 'jeditor', 'tinymce'])
        return self

    # def browser(self):
    #     if self._browser is None:
    #         self._browser_helper = Browser_Lamdba_Helper(headless=self.headless).setup()
    #         self._browser        = self._browser_helper.api_browser
    #     return self._browser

    # async def login_async(self):
    #     (server, username, password) = self.server_details().values()
    #     await self.open(server + '/login.jsp')
    #     page = await self.browser().page()
    #     #await page.type('#login-form-username', username)
    #     #await page.type('#login-form-password', password)
    #     #await page.click('#login-form-submit')

    def issue(self, issue_id):
        #(server, username, password) = self.server_details().values()
        path = '/browse/{0}?filter=-1'.format(issue_id)
        self.open(path)
        #self.browser().sync__await_for_element('.jira-help-tip')
        #self.browser().sync__js_execute("$('.jira-help-tip').hide()")

        #self.page.click('#show-more-links-link')
        self.page.javascript_eval("$('#show-more-links-link').click()")

        return self

    def login(self):
        path = '/login.jsp?os_destination=/rest/helptips/1.0/tips'
        self.open(path)
        page_text = self.page.text()

        if "Username" in page_text:
            self.page.type('#login-form-username',
                           self.server_details.get('username'))
            self.page.type('#login-form-password',
                           self.server_details.get('password'))
            self.page.javascript_eval('document.forms[1].submit()')
            self.page.wait_for_navigation()

    def logout(self):
        self.open('/logout')
        if self.page.exists('#confirm-logout-submit'):
            self.page.click('#confirm-logout-submit')
        return self

    def open(self, path):
        url = "{0}{1}".format(self.server_url, path)
        return self.page.open(url)

    def screenshot(self, width=None, height=None):
        if width:
            self.page.width(width, height)
        return self.page.screenshot()

    def fix_set_list_view(self):
        self.open('/issues/?filter=-1')
        self.page.javascript_eval("$('.aui-list-item-link').eq(1).click()")
        return self

    def fix_issue_remove_ui_elements(self):
        js_code = """
                        $('.command-bar'            ).hide();
                        $('#header'                 ).hide();
                        $('.aui-sidebar'            ).hide()
                        $('#viewissuesidebar'       ).hide();
                        $('#attachmentmodule'       ).hide();
                        $('#addcomment'             ).hide();                        
                        $('#footer'                 ).hide();
                        $('.aui-page-header-actions').hide();                        
                                             
                        $('#resolution-val'  )      .parent().hide();
                        $('#priority-val'    )      .parent().hide();
                        $('.remote-link'     ).eq(0).parent().hide();
                    """
        self.page.javascript_eval(js_code)
        return self
Beispiel #27
0
 def resolve_bot_token(self, team_id):
     if team_id == 'T7F3AUXGV': return Secrets('slack-gs-bot').value()
     if team_id == 'T0SDK1RA8':
         return Secrets('slack-gsbot-for-pbx').value()
Beispiel #28
0
class Web_Jira:
    def __init__(self, headless=True, new_page=False):
        self._browser = None
        self._browser_helper = None
        self.server_details = None
        self.server_url = None
        self.secrets_id = 'gw-bot-jira-web'
        self.headless = headless
        self.new_page = new_page
        self.page: Browser_Page = None

    def setup(self):

        self.page = Browser_Page(headless=self.headless,
                                 new_page=self.new_page).setup()
        self.server_details = Secrets(self.secrets_id).value_from_json_string()
        self.server_url = self.server_details.get('server')

        self.page.on_dialog__always_accept()
        #self.page.on_request__block_these(['glasswall.atlassian.net','jeditor','tinymce'])
        return self

    # def browser(self):
    #     if self._browser is None:
    #         self._browser_helper = Browser_Lamdba_Helper(headless=self.headless).setup()
    #         self._browser        = self._browser_helper.api_browser
    #     return self._browser

    # async def login_async(self):
    #     (server, username, password) = self.server_details().values()
    #     await self.open(server + '/login.jsp')
    #     page = await self.browser().page()
    #     #await page.type('#login-form-username', username)
    #     #await page.type('#login-form-password', password)
    #     #await page.click('#login-form-submit')

    def issue(self, issue_id):
        #(server, username, password) = self.server_details().values()
        path = '/browse/{0}'.format(issue_id)
        self.open(path)

        #self.browser().sync__await_for_element('.jira-help-tip')
        #self.browser().sync__js_execute("$('.jira-help-tip').hide()")

        #self.page.click('#show-more-links-link')
        #self.page.javascript_eval("$('#show-more-links-link').click()")

        return self

    def login(self):
        path = '/login.jsp?os_destination=/rest/helptips/1.0/tips'

        self.open(path)
        page_text = self.page.text()

        if "Log in to your account" in page_text:
            username = self.server_details.get('username')
            password = self.server_details.get('password')
            self.page.javascript_eval(
                f"document.forms[0].username.value='{username}'")
            self.page.click('#login-submit')

            self.page.wait_for_element__id__is_equal_to(
                'login-submit', "Log in")
            self.page.javascript_eval(
                f"document.forms[0].password.value='{password}'")
            self.page.click('#login-submit')

            self.page.wait_for_navigation(
            )  # first redirection to page that says 'Please wait...'
            self.page.wait_for_navigation(
            )  # final redirection to page that shows []

            #return self.page.wait_for_element__id()
            #from time import sleep
            #sleep(2)
            #self.page.click('#login-submit')

            #self.page.wait_for_navigation()
            #sleep(4)

            #self.page.wait_for_element__id('password')
            #self.page.type('#password', self.server_details.get('password'))

            #self.page.javascript_eval('document.forms[0].submit()')

    def logout(self):
        #self.page.browser.sync__open('https://www.google.com')
        self.open('/logout')
        if self.page.exists('#logout-submit'):
            self.page.click('#logout-submit')
            self.page.wait_for_navigation()
        return self

    def open(self, path):
        url = "{0}{1}".format(self.server_url, path)
        return self.page.open(url)

    def screenshot(self, width=None, height=None):
        if width:
            self.page.width(width, height)
        return self.page.screenshot()

    def fix_set_list_view(self):
        self.open('/issues/?filter=-1')
        self.page.javascript_eval("$('.aui-list-item-link').eq(1).click()")
        return self

    def fix_issue_remove_ui_elements(self):
        # js_code =   """
        #                 $('.command-bar'            ).hide();
        #                 $('#header'                 ).hide();
        #                 $('.aui-sidebar'            ).hide()
        #                 $('#viewissuesidebar'       ).hide();
        #                 $('#attachmentmodule'       ).hide();
        #                 $('#addcomment'             ).hide();
        #                 $('#footer'                 ).hide();
        #                 $('.aui-page-header-actions').hide();
        #
        #                 $('#resolution-val'  )      .parent().hide();
        #                 $('#priority-val'    )      .parent().hide();
        #                 $('.remote-link'     ).eq(0).parent().hide();
        #             """
        js_code = """   
                        contains = function (selector, text)   {   var elements = document.querySelectorAll(selector);
                                                                   return [].filter.call(elements, function(element){
                                                                      return RegExp(text).test(element.textContent); });}
                        remove = function(selector,text,index) {
                                                                   target = contains(selector,text)[index]
                                                                   if (target) {target.remove()} }

                        remove('div' , 'updating the issue view', 11)
                        remove('span','Activity' ,0)                            
                        document.querySelector('[data-testid="Navigation"]').remove()
                        document.querySelector('#jira-issue-header').children[0].children[0].children[0].children[0].children[0].children[1].remove()

                        //external share
                        contains('div', 'External Share').pop().parentElement.parentElement.parentElement.remove()
                        """
        self.page.javascript_eval(js_code)
        return self
 def resolve_bot_token(self):
     return Secrets(self.secret_name).value()