def Openbrower(self, type='Chrome'): if type == 'Chrome' or type == '': # 创建一个ChromeOptions对象 option = webdriver.ChromeOptions() # 去掉浏览器提示条的提示 option.add_argument('disbale-infobars') try: # 异常处理,如果获取到,使用获取到的路径 userdir = os.environ['USERPROFILE'] logger.info(userdir) except Exception as e: userdir = 'C:\\Users\\Xy' # 如果没有获取到,则使用默认的文件路径 logger.exception(e) userdir += '\\AppData\\Local\\Google\\Chrome\\User Data' userdir = '--user-data-dir=' + userdir # 添加用户目录 option.add_argument(userdir) #调用浏览器 self.driver = webdriver.Chrome( executable_path="./Web/lib/chromedriver.exe", chrome_options=option) self.driver.implicitly_wait(3) # self.driver.find_element_by_xpath().text if type == 'Ie': self.driver = webdriver.Ie( executable_path='./Web/lib/IEDriverServer.exe', desired_capabilities=None) if type == 'gc': self.driver = webdriver.Firefox( executable_path="./Web/lib/geckodriver.exe")
def sleep(self, s): try: time.sleep(int(s)) self.writer.write(self.writer.row, 7, 'PASS') except Exception as e: logger.exception(e) self.writer.write(self.writer.row, 8, str(traceback.format_exc()))
def __find_element(self, locator="None"): """ 兼容3中查找方式:id、xpath、accessibility 格式如下:id :com.das.face:id/etIp4 xpath://*[@text="设备名称"]/../*[3] accessibility: 部分APP软件会使用该定位 :param locator: :return: """ element = None try: if not locator == 'None': if locator.find(':id/') > 0: element = self.driver.find_element_by_id(locator) elif locator.startswith('//'): element = self.driver.find_element_by_xpath(locator) else: element = self.driver.find_element_by_accessibility_id(locator) self.__write_excel(True) # else: # self.__write_excel(False, '定位表达式为空') except Exception as e: element = None logger.exception(e.__str__()) self.__write_excel(False, dsc='未定位到元素,请检查定位表达式是否正确;错误信息:{}'.format(e.__str__())) logger.info('locator = {},element = {}'.format(locator, element)) return element
def select(self, sql): try: self._cursor.execute(sql) result = self._cursor.fetchall() return result except ProgrammingError as e: logger.exception(e)
async def week_stats_from_players(week_players, all_server_stats): try: for player in week_players: p_name = player['player'] # build init player dict if not there if not p_name in all_server_stats: all_server_stats[p_name] = { 'name': util.name_to_discord(p_name), 'xp_all': 0, 'rank_weight': 0, 'rank_1': 0, 'rank_2': 0, 'rank_3': 0 } p_stats = all_server_stats[p_name] # add to total xp p_stats['xp_all'] += player['xp'] # rank stuff rank = player['rank'] if rank == 1: p_stats['rank_1'] += 1 p_stats['rank_weight'] += 3 if rank == 2: p_stats['rank_2'] += 1 p_stats['rank_weight'] += 2 if rank == 3: p_stats['rank_3'] += 1 p_stats['rank_weight'] += 1 except Exception as e: logger.exception(e)
def quit(self): try: self.driver.quit() self.writer.write(self.writer.row, 7, 'PASS') except Exception as e: logger.exception(e) self.writer.write(self.writer.row, 8, str(traceback.format_exc()))
def uploadfile(self, xpath, filepath): """ 根据xpath,找到元素 使用send_keys上传文件 :param xpath: 元素的xpath :param filepath: 需要上传文件的全路径 :return: 无 """ try: ele = self.driver.find_element_by_xpath(xpath) except Exception as e: logger.exception(e) self.writer.write(self.writer.row, self.writer.clo, 'FAIL') self.writer.write(self.writer.row, self.writer.clo + 1, str(traceback.format_exc())) # 定位失败,则直接返回 return False try: ele.send_keys(filepath) self.writer.write(self.writer.row, self.writer.clo, 'PASS') self.writer.write(self.writer.row, self.writer.clo + 1, "上传成功") return True except Exception as e: logger.exception(e) self.writer.write(self.writer.row, self.writer.clo, 'FAIL') self.writer.write(self.writer.row, self.writer.clo + 1, str(traceback.format_exc())) return False
def shape_up(self, raw_data): """ A method for preparing pandas self.dataset from raw JSON :param raw_data: A input JSON data from URL response. :return: Pandas self.dataset """ try: dataset = self._dataset.from_dict(raw_data, orient='index') dataset.reset_index(level=0, inplace=True) dataset.rename(columns={ 'index': 'ip_address', 'first_seeen': 'first_seen', 'lat': 'latitude', 'long': 'longitude' }, inplace=True) dataset.drop_duplicates(subset='ip_address', keep='first', inplace=True) dataset['ip_address'] = dataset['ip_address'].astype('str') dataset['reliability'] = dataset['reliability'].astype('int') dataset['priority'] = dataset['priority'].astype('int') dataset['latitude'] = dataset['latitude'].astype('float') dataset['longitude'] = dataset['longitude'].astype('float') dataset['dest_port'] = dataset['dest_port'].astype('int') dataset['last_online'] = dataset['last_online'].astype('str') dataset['first_seen'] = dataset['first_seen'].astype('str') dataset['revision'] = 0 return dataset except Exception as err: logger.exception(err)
def assertequals(self, jpath, value): """ 断言json结果中某个键的值和value相等 :param key: json结果的键 :param value: 预期值 :return: 无 """ value = self.__get_param(value) status = False if value == 'None': value = None res = str(self.result) # 返回结果转为字符串 # 尝试用jsonpath提取jpath表达式中获取到的值,如果失败,res = str(self.result) try: res = str(jsonpath.jsonpath(self.jsonres, jpath)[0]) except Exception as e: res = None logger.exception(e) pass if res == value: logger.info('断言成功') status = True self.writer.write(self.writer.row, 7, 'PASS') self.writer.write(self.writer.row, 8, str(res)) else: logger.info('断言失败') self.writer.write(self.writer.row, 7, 'FAIL') self.writer.write(self.writer.row, 8, '实际:' + str(res)) if res == None: res = 'None' print("实际值:" + str(res)) return status
def get(self, url, params=None): """ 发送get请求 :param url: :param params: textSearch=96800 :return: """ self.status_code = '' # 响应码置为空字符串,否则这时的响应码可能为上个请求的 # 判断url格式 if not (url.startswith('http') or url.startswith('https')): url = self.url + url + '?' + params else: url = url + '?' + params # 如果请求https请求,报ssl错误,就在下面添加verify=False参数 res = self.session.get(url, verify=False) # 发包 self.status_code = res.status_code # 响应码 self.result = res.content.decode("utf8") print("get请求响应结果:%s" % self.result[0:200]) # 打印的内容会在BeautifulReport中可以看到 try: jsons = self.result jsons = jsons[jsons.find('{'):jsons.rfind('}') + 1] # 尝试处理非标准格式的json self.jsonresult = json.loads(jsons) self.writer.write(self.writer.row, 7, 'PASS') self.writer.write(self.writer.row, 8, str(self.jsonresult)) except Exception as e: # 等于空,不然等于上一次请求保存的json结果 self.jsonresult = {} logger.exception(e) self.writer.write(self.writer.row, 7, 'FAIL') self.writer.write(self.writer.row, 8, str(self.result))
async def myaccounts(self, ctx): try: player_list = await db.get_member_entry(ctx.guild, ctx.author, 'players') await ctx.send(f"**{ctx.author.name}** - *{'* **|** *'.join(player_list)}*") except Exception as e: logger.exception(f'Error fetching all accounts: {e}') return await ctx.send(f'Error fetching all accounts!')
def get_difference(self, response_df): """ A method for getting changed cell values of existing records against database records :param response_df: A dataframe generated from response :return: None """ ip_table = conf.read().get('db-conf', 'ip_table') try: table = pd.read_sql( "SELECT * FROM {};".format(ip_table), con=self.db.engine, chunksize=self.chunk_size ) cols = [ 'ip_address', 'reliability', 'priority', 'activity', 'sub_category', 'country', 'city', 'latitude', 'longitude', 'source', 'target', 'dest_port', 'last_online', 'first_seen', 'used_by', 'reference_link' ] df = response_df diff_df = [] while True: chunk = next(table) exist_df = df[df['ip_address'].isin(chunk['ip_address'].values)] exist_df = exist_df.sort_values('ip_address').reset_index(drop=True) chunk_df = chunk[chunk['ip_address'].isin(exist_df['ip_address'].values)] chunk_df = chunk_df.sort_values('ip_address').reset_index(drop=True) chunk_df = chunk_df[cols] exist_df = exist_df[cols] diff = self.diff_df(exist_df, chunk_df, how='left') diff_df.append(diff) if len(chunk.index) < self.chunk_size: break self._updated_df = pd.concat(diff_df) return self._updated_df except (StopIteration, TypeError, ValueError) as err: logger.exception(err, exc_info=False)
def make_boss_update(self, old_data, new_data, title, kill_new, kill_old, kill_diff, action_1, action_2): logger.debug(f"assigning Boss: {title}...") # check for boss milestones found_milestone = False threshold = 500 # loop thru intervals to see if a threshold has been passed increment = threshold while kill_new >= threshold: if kill_old < threshold: message = f"**{self.rs_name} has {action_1} {title} at least {util.format_int_str(threshold)} times**\ ```c\nTotal {action_2} count: {new_data['score']} | Current rank: {new_data['rank']}```" self.milestones.append(message) logger.debug(f"appended Boss update for {title} to milestones list...") found_milestone = True break else: threshold += increment # done with loop, check if posting regular update logger.debug("done checking loop...") if not found_milestone: # set correct tense of time --not needed anymore, flipped total/new counts - 7/4/20 # if kill_diff == 1: times = 'time' # else: times = 'times' logger.debug("found diff...") try: message = f"**{self.rs_name} has {action_1} {title} {new_data['score']} times**```c\nNew {action_2}s logged: {util.format_int_str(kill_diff)} | Current rank: {new_data['rank']}```" except Exception as e: logger.exception(f'Error posting boss update: {e}') logger.debug("made message...") self.minigames.append(message) logger.debug(f"appended update for {title} to minigames list...") logger.debug(f"done checking Bosses...")
def hover(self, xpath): """ 根据xpath,找到元素,并将鼠标悬停到元素 该关键字自动化过程中,如果认为移动了鼠标可能导致悬停失败 该关键字也可以用于页面滚动,但不一定都能滚动成功 :param xpath: 元素的xpath :return: """ try: ele = self.driver.find_element_by_xpath(xpath) except Exception as e: logger.exception(e) self.writer.write(self.writer.row, self.writer.clo, 'FAIL') self.writer.write(self.writer.row, self.writer.clo + 1, str(traceback.format_exc())) # 定位失败,则直接返回 return False try: actions = ActionChains(self.driver) actions.move_to_element(ele).perform() self.writer.write(self.writer.row, self.writer.clo, 'PASS') self.writer.write(self.writer.row, self.writer.clo + 1, "悬停成功") return True except Exception as e: logger.exception(e) self.writer.write(self.writer.row, self.writer.clo, 'FAIL') self.writer.write(self.writer.row, self.writer.clo + 1, str(traceback.format_exc())) # 定位失败,则直接返回 return False
def set_case(self, case): """ 设置用例, 把Excel某一行赋值过来 :param case: list类型 :return:如果有关联的字符串,将其返回,并重新写Excel """ # openpyxl 的行和列从1开始,这里进行减1操作 if not case[cell_config.get('path') - 1].startswith('http'): path = "/" + case[cell_config.get('path') - 1] self.path = self.url + path.replace("//", "/") else: self.path = case[cell_config.get('path') - 1] if case[cell_config.get('method') - 1] is not None: self.method = case[cell_config.get('method') - 1] if case[cell_config.get('params') - 1] is None or case[ cell_config.get('params') - 1] == '' or case[ cell_config.get('params') - 1].lower() == 'none' or case[cell_config.get('params') - 1].lower() == 'null': self.params = None else: self.relation_params_temp = self._get_relations( case[cell_config.get('params') - 1]) try: self.params = json.loads(self.relation_params_temp) except Exception as e: logger.exception(traceback.format_exc()) self.params = None
def put(self): try: self.response = self.session.put(url=self.path, json=self.params) except Exception as e: logger.exception(traceback.format_exc()) self.response = None return self.response
def call_back_toservice(task, query): logger.debug('[callback a verifytask by rabbitmq]') try: credentials = pika.PlainCredentials(username=task.master_info['spider_mq_user'] , password=task.master_info['spider_mq_passwd']) connection = pika.BlockingConnection( pika.ConnectionParameters( host=task.master_info['spider_mq_host'], virtual_host=task.master_info['spider_mq_vhost'], credentials=credentials ) ) channel = connection.channel() msg = json.dumps({ 'qid': task.req_qid, 'type': task.callback_type, 'uid': task.req_uid, 'query': json.dumps(query) }) res = channel.basic_publish( exchange=task.master_info['spider_mq_exchange'], routing_key=task.master_info['spider_mq_routerKey'], properties=pika.BasicProperties(delivery_mode=2), body=msg, ) connection.close() if not res: raise Exception('RabbitMQ Result False') logger.debug('[callback a verifytask done]') except Exception as exc: logger.exception("callback a task fail. error = {0}".format(traceback.format_exc()))
async def message_server(Server, serv_dict, message, mention): """ Needs dict:\n { "id": [guild.id], "channel": [channel.id] or None, "role": [role.id] or None } """ try: # If not channel in this server then skip server if serv_dict["channel"]: rs_chan = Server.get_channel(serv_dict["channel"]) # Get mention role, if not then use @here, empty if not mentioning rs_role_men = '' if mention: if serv_dict["role"]: rs_role = Server.get_role(serv_dict["role"]) rs_role_men = rs_role.mention # CHANGE FOR TESTING else: rs_role_men = "@here" # Send message! await rs_chan.send(f'{message}\n{rs_role_men}') logger.info( f"Sent message in guild id: {serv_dict['id']} | name: {Server.name} | channel: {rs_chan.name} | Mention: {mention}" ) else: logger.info( f"Could not send message in guild id: {serv_dict['id']} -- No channel specified" ) except Exception as e: logger.exception( f"Could not send message in guild id: {serv_dict['id']} -- {e}")
def __find_element(self, xpath): try: element = WebDriverWait( self.driver, 10, 0.5).until(lambda x: x.find_element(By.XPATH, xpath)) return element except Exception as e: logger.exception(str(traceback.format_exc()))
def delete(self): try: self.response = self.session.delete(url=self.path, params=self.params) except Exception as e: logger.exception(traceback.format_exc()) self.response = None return self.response
def sleep(self, t=3): try: time.sleep(int(float(t))) self.writer.write(self.writer.row, 7, 'PASS') except Exception as e: logger.exception(e) self.writer.write(self.writer.row, 7, 'FAIL') self.writer.write(self.writer.row, 8, e)
def switchToParentFrame(self): try: self.driver.switch_to.default_content() self.writer.write(self.writer.row, self.writer.clo, "PASS") logger.info("回到最外层iframe成功") except Exception as e: self.writer.write(self.writer.row, self.writer.clo, "FAIL") self.writer.write(self.writer.row, self.writer.clo + 1, str(e)) logger.exception(e)
def openUrl(self, url): try: self.driver.get(url) self.writer.write(self.writer.row, self.writer.clo, "PASS") logger.info("打开指定url:" + url + "成功") except Exception as e: self.writer.write(self.writer.row, self.writer.clo, "FAIL") self.writer.write(self.writer.row, self.writer.clo + 1, str(e)) logger.exception(e)
def closePage(self): try: self.driver.close() self.writer.write(self.writer.row, self.writer.clo, "PASS") logger.info("关闭当前页面成功") except Exception as e: self.writer.write(self.writer.row, self.writer.clo, "FAIL") self.writer.write(self.writer.row, self.writer.clo + 1, str(e)) logger.exception(e)
def flush_db(): """ A method to truncate blocked_ips table """ try: BlockedIPsModel.query.delete() db.session.commit() except Exception as err: logger.exception(err)
def closeBrowsers(self): try: self.driver.quit() self.writer.write(self.writer.row, self.writer.clo, "PASS") logger.info("关闭浏览器成功") except Exception as e: self.writer.write(self.writer.row, self.writer.clo, "FAIL") self.writer.write(self.writer.row, self.writer.clo + 1, str(e)) logger.exception(e)
def click(self, xpath): try: self.driver.find_element_by_xpath(xpath).click() self.writer.write(self.writer.row, self.writer.clo, "PASS") self.writer.write(self.writer.row, self.writer.clo + 1, "点击成功") except Exception as e: logger.exception(e) self.writer.write(self.writer.row, self.writer.clo, "FAIL") self.writer.write(self.writer.row, self.writer.clo + 1, str(e))
def input(self, xpath, text): try: ele = self.__find_element(xpath) ele.send_keys(text) self.writer.write(self.writer.row, self.writer.clo + 1, "输入成功") except Exception as e: logger.exception(e) self.writer.write(self.writer.row, self.writer.clo, "FAIL") self.writer.write(self.writer.row, self.writer.clo + 1, str(e))
def outiframe(self, xpath): try: self.driver.switch_to().default_content() self.writer.write(self.writer.row, self.writer.clo, "PASS") self.writer.write(self.writer.row, self.writer.clo + 1, "输入成功") except Exception as e: logger.exception(e) self.writer.write(self.writer.row, self.writer.clo, "FAIL") self.writer.write(self.writer.row, self.writer.clo + 1, str(e))
def input(self, xpath, text): try: self.driver.find_element_by_xpath(xpath).send_keys(text) self.writer.write(self.writer.row, self.writer.clo, "PASS") self.writer.write(self.writer.row, self.writer.clo + 1, "输入成功") except Exception as e: logger.exception(e) self.writer.write(self.writer.row, self.writer.clo, "FAIL") self.writer.write(self.writer.row, self.writer.clo + 1, str(e))