def get_updated_settings(args): settings = Settings.load() u = User(user=args.user, password=args.password) s = XcodeServer(host=args.host, port=args.port) settings.update(s, u) settings.validate() return settings
class WebBrowser(QObject): dic_url = {'SWGS': 'http://172.31.196.21:8060/websquare/websquare.html?w2xPath=/SWING/lib/xml/ZLIBSMAN90010.xml&coClCd=T&svrLocation=SWGS'} browser_log = [] requestList = [] eventList = [] browser_log_hst = [] HOME = os.path.expanduser("~") SAVE_PATH = os.path.join(HOME, 'Test_Tool') HOME_SAVE_PATH = os.path.join(HOME, '.test_tool') def __init__(self, sid, url='', websocket_server=None): QObject.__init__(self) self.sid = sid self.url = url self.driver = None self.recorder = None self.requestList = [] self.eventList = [] self.browser_log = [] self.browser_log_hst = [] self.chromedriver_version = '' self.recording = False self.web_iframe_list = [] # Load setting in the main thread self.settings = Settings(self.HOME_SAVE_PATH) self.settings.load() self.settings.save() self._loadSetting() self.config = Config() self.paths = [r"C:\Program Files\Google\Chrome\Application\chrome.exe", r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"] self.paths.extend(self.config.getlist("section_browser", "BROWSER_PATH")) self.browser_version = self.config.get('section_browser', 'BROWSER_VER') if self.sid in self.dic_url.keys(): print(self.dic_url[self.sid]) elif self.sid == 'URL': print(self.url) self.dic_url[self.sid] = self.url else: print('미존재 SID') self.websocket_server = websocket_server self.websocket_server.receivedSignal.connect(self.websocketSeverReceived) def _loadSetting(self): ''' 설정값으로 재설정 :return: None ''' self.getDriverVersion() def getDriverVersion(self): self.settings.load() self.chromedriver_version = self.settings.get("CHROMEDRIVER_VERSION", "") def getVersionViaCom(self): version_info = [] paths = self.paths try: parser = Dispatch("Scripting.FileSystemObject") except: if self.browser_version: result_verion= self.browser_version else: result_verion = '' return result_verion for file_name in paths: try: version = parser.GetFileVersion(file_name) version_info.append(version) except: pass try: result_verion = version_info[0].split('.')[0] except: result_verion = '' return result_verion def processBrowserLogEntry(self, entry): response = json.loads(entry['message'])['message'] return response def findEventLog(self, type, evets): requestList = [] xhr_events = [event for event in evets if 'type' in event['params'].keys() and event['params']['type'] == type] xhr_events = [event for event in xhr_events if event['params']['request']['method'] == 'POST' and 'postData' in event['params']['request'].keys()] #print('==== XHR List ====') for idx, xhr in enumerate(xhr_events): post_data = xhr['params']['request']['postData'] try: trx_code = json.loads(post_data)['HEAD']['Trx_Code'] except json.JSONDecodeError as e: print(e) print(post_data) request_id = xhr['params']['requestId'] #print('{index} - {trxCode} - {requestId}'.format(index=idx, trxCode=trx_code, requestId=request_id)) inputData = {} outputData = {} # request결과가 없는 경우가 있음 (ZNGMSATH10060_TR03) 결과가 없으면 제외 try: inputData = json.loads(self.driver.execute_cdp_cmd('Network.getRequestPostData', {'requestId': str(request_id)})['postData']) outputData = json.loads(self.driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': str(request_id)})['body']) if 'dataInfo' not in list(outputData.keys()): outputData = makeDataInfo(outputData) requestDtl = {'trx_code': trx_code, 'request_id': request_id, 'input_data': inputData, 'output_data': outputData} requestList.append(requestDtl) except: pass return requestList def getInputDataset(self, events, idx): return json.loads(events[idx]['params']['request']['postData']) def popUp(self): version = self.getVersionViaCom() chromedriver_path = os.path.join(self.SAVE_PATH, 'chromedriver.exe') self.getDriverVersion() if not os.path.exists(chromedriver_path): print('chromedriver 파일 미존재 - 생성....') self.downloadChromedriver(version, chromedriver_path) elif version == self.chromedriver_version: print('동일한 Chrome / chromedriver 버전 - [{}]'.format(version)) else: print('Chrome [{chrome_version}] / chromedriver [{chromedriver_version}] 버전이 다른 경우'.format(chrome_version=version, chromedriver_version=self.chromedriver_version)) self.downloadChromedriver(version, chromedriver_path) self.web_iframe_list = [] chrome_options = Options() #chrome_options.add_argument("start-maximized") chrome_options.add_argument("disable-infobars") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("window-size=1920x1080") # 가져올 크기를 결정 chrome_options.set_capability('unhandledPromptBehavior', 'accept') caps = DesiredCapabilities.CHROME caps['goog:loggingPrefs'] = {'performance': 'ALL'} if self.driver and self.getStatus(): pass else: # 드라이버 객체 생성 self.driver = webdriver.Chrome(chromedriver_path, chrome_options=chrome_options, desired_capabilities=caps) #self.driver.implicitly_wait(3) # 드라이버 초기화를 위해 3초 대기 self.get() def get(self): self.driver.get(self.dic_url[self.sid]) if self.sid == 'SWGS': try: self.driver.switch_to_alert() alert = WebDriverWait(self.driver, 1).until(EC.alert_is_present()) alert.accept() except NoAlertPresentException: pass finally: while True: try: WebDriverWait(self.driver, 0).until(EC.element_to_be_clickable((By.ID, 'bodyBlock'))) except: break try: WebDriverWait(self.driver, 60).until(EC.presence_of_element_located((By.ID, 'mdi01_subWindow0_iframe'))) finally: print('Page is ready!') self.driver.execute_script('''top.document.title = "(FOR AUTO TEST TOOL)"''') # Recorder 선언 self.recorder = Recorder(self.driver) self.recorder.addEventListener() #threading.Timer(3, self.getBrowserEvents).start() def getRequest(self): try: self.driver.switch_to_alert() except NoAlertPresentException: log = self.driver.get_log('performance') self.browser_log.extend(log) self.browser_log_hst.extend(log) events = [self.processBrowserLogEntry(entry) for entry in self.browser_log] # response_events = [event for event in events if 'Network.response' in event['method']] request_events = [event for event in events if 'Network.requestWillBeSent' in event['method']] self.requestList = self.findEventLog('XHR', request_events) return self.requestList def getRequestHst(self): try: self.driver.switch_to_alert() except NoAlertPresentException: log = self.driver.get_log('performance') self.browser_log.extend(log) self.browser_log_hst.extend(log) events = [self.processBrowserLogEntry(entry) for entry in self.browser_log_hst] # response_events = [event for event in events if 'Network.response' in event['method']] request_events = [event for event in events if 'Network.requestWillBeSent' in event['method']] self.requestHst = self.findEventLog('XHR', request_events) return self.requestHst def clear(self): self.browser_log_hst.extend(self.driver.get_log('performance')) self.browser_log = [] self.requestList = [] print('Request Clear Successful') def clearUiEventList(self): self.recorder.clearEventList() def recordUiEvent(self): if not self.recording: self.recorder.clearEventList() self.recorder.addEventListener() self.recording = not self.recording def websocketSeverReceived(self, data): ''' :websocket Server로부터 data를 받았을때 발생하는 이벤트 data: (str) 'add_iframe' ''' #print(data) if data == 'add_iframe': self.recorder.addEventListener() def getBrowserEvents(self): events = [] try: events = self.recorder.getEventList() #threading.Timer(3, self.getBrowserEvents).start() except JavascriptException: self.recorder.addEventListener() events = self.recorder.getEventList() #threading.Timer(3, self.getBrowserEvents).start() except WebDriverException: print('Browser 종료') finally: #print(events) self.recorder.addEventListener() return events # if events: # print(events) # self.eventList.extend(events) #self.recorder.clearEventList() # for event in events: # # One-time initialization # toaster = ToastNotifier() # # # Show notification whenever needed # toaster.show_toast(title="Command Record", # msg="Command:{command}\nTarget:{target}\nValue:{value}".format(command=event[1], target=event[3], value=event[5]), # threaded=True, # icon_path='auto_test_main.ico', # duration=1) # notification.notify( # title='Command Record', # ticker='A', # message="Command:{command}\nTarget:{target}\nValue:{value}".format(command=event[1], target=event[3], value=event[5]), # app_name="Auto Test Tool 0.0.4", # app_icon='auto_test_main.ico', # timeout=5, # seconds # ) def getDriver(self): return self.driver def getEventList(self): return self.eventList def getSessionId(self): if self.driver: return self.driver.session_id else: return False def setSessionId(self, session_id): self.driver.session_id = session_id def getStatus(self): try: self.driver.window_handles return True except: return False def setFocus(self): self.driver.switch_to_window(self.driver.current_window_handle) def saveChromedriverVersion(self, version): ''' chromedriver version 정보를 저장 ''' self.settings.load() self.settings["CHROMEDRIVER_VERSION"] = version self.settings.save() def chromedriverWebOn(self): ''' chromedriver site 접속 가능여부 체크 ''' url = "https://chromedriver.chromium.org/downloads" try: res = urllib.request.urlopen(url) if res.status == 200: return True else: return False except: return False def downloadChromedriver(self, version, chromedriver_path): ''' chromedriver가 미존재하거나 버전이 다른 경우 발생하는 이벤트 - 온라인 연결이 가능한 경우는 다운로드 - 온라인 연결이 불가능한 경우 임시 파일 중 가능한 버전으로 대체 :param version: (str) '81' :param chromedriver_path: (str) ''' if self.chromedriverWebOn(): print("Chromedriver Downloading...") download_url = self.findDriverVersion(version) download_path = os.path.join(self.SAVE_PATH, "chromedriver.zip") urllib.request.urlretrieve(download_url, download_path) print("Download Complete!") proc_name = "chromedriver.exe" # 현재 수행중인 chromedriver 존재여부 확인 for proc in psutil.process_iter(): try: if proc.name().lower() == proc_name.lower(): print('현재 수행중인 chromedriver kill [{}]'.format(proc.name())) proc.kill() except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass try: with zipfile.ZipFile(download_path) as zf: zf.extractall(path=self.SAVE_PATH) os.remove(download_path) except Exception as e: print(e) self.saveChromedriverVersion(version) else: print('Online 연결 불가능 - 오프라인 파일 생성') try: if version == '81': shutil.copy('chromedriver_tmp/chromedriver_81.exe', chromedriver_path) self.saveChromedriverVersion(version) elif version == '80': shutil.copy('chromedriver_tmp/chromedriver_80.exe', chromedriver_path) self.saveChromedriverVersion(version) elif version == '79': shutil.copy('chromedriver_tmp/chromedriver_79.exe', chromedriver_path) self.saveChromedriverVersion(version) elif version in ['65', '66', '67']: shutil.copy('chromedriver_tmp/chromedriver_65.exe', chromedriver_path) self.saveChromedriverVersion(version) else: print('Chrome Version Check : {} - 오프라인은 65, 66, 67, 79, 80, 81 Version만 지원가능'.format(version)) return False except: pass pass def findDriverVersion(self, find_version): ''' chromedriver를 다운로드 할 url를 찾아 string으로 Return chromedriver chrome 85 85 . . . . 71 71 70 70 --------------------- 2.46 71-73 2.45 70-72 2.44 69-71 2.43 69-71 2.42 68-70 2.41 67-69 2.40 66-68 2.39 66-68 2.38 65-67 2.37 64-66 2.36 63-65 2.35 62-64 2.34 61-63 2.33 60-62 --------------------- 2.28 57+ 2.25 54+ 2.24 53+ 2.22 51+ 2.19 44+ 2.15 42+ :param find_version: (str) '81' :return: (str) https://chromedriver.storage.googleapis.com/81.0.4044.138/chromedriver_win32.zip ''' download_url = '' base_url = "https://chromedriver.chromium.org/downloads" base_req = requests.get(base_url) base_soup = BeautifulSoup(base_req.content, "html.parser") atags = base_soup.select("a") for a in atags: m = re.compile("ChromeDriver (.*)") p = m.search(a.text) try: version = p.group(1) try: m = re.compile("(\d*)\..*") p = m.search(version) if int(find_version) == int(p.group(1)): download_url = "/".join( [ "https://chromedriver.storage.googleapis.com", version, "chromedriver_win32.zip", ] ) break except: pass except AttributeError: pass return download_url
try: # Check or create database file db = Database(DB_FILE) try: table = db.table(DB_TABLE).create({ "topic": int, "posts": int }, pk="topic") except sqlite3.OperationalError: # Table already exists table = db[DB_TABLE] # Config cfg = Settings(CFG_FILE) if cfg.load(CFG_FORUM, Const.cfg_opts_modo): phpbb = PhpBB(cfg.host) words_list = tools.configsplit(cfg.keywords) else: sys.exit(1) # forum.setUserAgent(cfg.user_agent) if phpbb.login(cfg.username, cfg.password): print("Login") # f_id = cfg.forum_id.split("&start")[0] mode = 0 while True: mode = input(Const.MODE_CHOICE2) if 1 <= int(mode) <= 4: break else:
class SessionDialog(QDialog, dig_class): appname = 'DB Session' session = None HOME = os.path.expanduser("~") HOME_SAVE_PATH = os.path.join(HOME, '.test_tool') SAVE_PATH = os.path.join(HOME, 'Test_Tool') SESSION_PATH = os.path.join(SAVE_PATH, 'session') SESSION_FILE = os.path.join(SESSION_PATH, 'db_con.ini') def __init__(self): super().__init__() self.setupUi(self) self.setWindowTitle(self.appname) if not os.path.exists(self.SESSION_PATH): os.makedirs(self.SESSION_PATH) # Load setting in the main thread self.settings = Settings(self.HOME_SAVE_PATH) self.loadUiInit() self.loadSetting() self.componentSetting() # Button 클릭 이벤트 self.btn_dbConnection.clicked.connect( self.btnDbConnectionClicked) # DB Connection 버튼 self.btn_cancel.clicked.connect(self.btnCancleClicked) # Cancel 버튼 # Tree Item Change 이벤트 self.tw_dbList.itemPressed.connect( self.tw_dbListItemPressed) # DB List - Tree Item Pressed 이벤트 self.edt_user.textChanged.connect( self.componentSetting) # User Edit 수정 self.edt_password.textChanged.connect( self.componentSetting) # Password Edit 수정 # Table 더블클릭 이벤트 self.tw_dbList.doubleClicked.connect( self.twDbDoubleClicked) # DB Tableview 더블클릭 이벤트 self.cb_dBName.currentIndexChanged['QString'].connect( self._cbDbNameCurrentIndexChanged) def loadUiInit(self): try: tns_path = os.environ['TNS_ADMIN'] except: tns_path = '' print("TNS_ADMIN 시스템변수 추가필요") self.tnsList = tnsnameParser(tns_path) if self.tnsList == []: pass else: # os.environ['TNS_ADMIN'] self.cb_dBName.clear() self.cb_dBName.addItems(self.tnsList) self.cb_dBName.insertItem(0, 'SWGS.JSD') def loadSetting(self): self.settings.load() db_save = self.settings.get("SETTING_DBSAVE", False) db = self.settings.get("SETTING_DB", False) user = self.settings.get("SETTING_USER", False) password = self.settings.get("SETTING_PASSWORD", False) if db_save: defaultSetting(self.chk_dbSave, db_save) if db: defaultSetting(self.cb_dBName, db) if user: defaultSetting(self.edt_user, user) if password: defaultSetting(self.edt_password, password) def componentSetting(self): if self.edt_user.text() == '' or self.edt_password.text() == '': self.btn_dbConnection.setEnabled(False) # DB [Connection] 비활성화 else: self.btn_dbConnection.setEnabled(True) # DB [Connection] 활성화 self.makeSessionList(self.tw_dbList, self.cb_dBName.currentText(), self.edt_user.text()) def btnDbConnectionClicked(self): settings = self.settings settings.load() self.session = Session(self.cb_dBName.currentText(), self.edt_user.text(), self.edt_password.text()) try: self.session.connection() self.existsDBSection(self.cb_dBName.currentText(), self.edt_user.text(), self.edt_password.text(), self.chk_dbSave.isChecked(), True) QMessageBox.information( self, "DB Connect", "[{}] DB Connection Successful".format(self.session.sid)) self.accept() except Exception as e: self.session = None self.existsDBSection(self.cb_dBName.currentText(), self.edt_user.text(), self.edt_password.text(), self.chk_dbSave.isChecked(), False) QMessageBox.information(self, "DB Connection Fail", str(e)) settings["SETTING_DB"] = self.cb_dBName.currentText() settings["SETTING_USER"] = self.edt_user.text() settings["SETTING_PASSWORD"] = self.edt_password.text() settings["SETTING_DBSAVE"] = self.chk_dbSave.isChecked() settings.save() def twDbDoubleClicked(self): parentNode = None for item in self.tw_dbList.selectedItems(): parentNode = item.parent() if parentNode is None: pass else: self.btn_dbConnection.click() def _cbDbNameCurrentIndexChanged(self, item): if item in ['demo.db', 'SWGS.JSD']: self.edt_user.setText('Test') self.edt_password.setText('Test') self.edt_user.setEnabled(False) self.edt_password.setEnabled(False) else: self.edt_user.setText('') self.edt_password.setText('') self.edt_user.setEnabled(True) self.edt_password.setEnabled(True) def btnCancleClicked(self): self.session = None self.reject() def popUp(self): self.exec_() def makeSessionList(self, tree_widget, db_sid, db_user): self.connectionList = [] tree_widget.clear() con_group = [] # Selected Tables Info try: if os.path.isfile(self.SESSION_FILE): pass else: f = open(self.SESSION_FILE, 'w') f.close connectionList = readConf(self.SESSION_FILE) except: self.statusbar.showMessage('db_con.ini 확인이 필요합니다.') return False for idx, con in enumerate(connectionList): con_group.append(con['group']) connectionInfo = { 'sect': con['sect'], 'group': con['group'], 'user_id': con['user_id'], 'password': con['password'], 'saved': con['saved'] } self.connectionList.append(connectionInfo) con_group = list(set(con_group)) # Source DB TreeWidget for idx, groupInfo in enumerate(con_group): parent_node = addTreeRoot(treeWidget=tree_widget, idx=0, text=groupInfo, check=False) child_tables = (item for item in connectionList if item['group'] == groupInfo) for idy, table in enumerate(child_tables): child_node = addTreeChild(parent=parent_node, text=table['user_id'], check=False) if table['sect'] == (db_sid + '_' + db_user): tree_widget.setCurrentItem(child_node) tree_widget.sortByColumn(0, Qt.AscendingOrder) tree_widget.expandToDepth(0) def existsDBSection(self, db_sid, db_user, db_password, db_saved, db_connected): config = ConfigParser() try: if os.path.isfile(self.SESSION_FILE): pass else: f = open(self.SESSION_FILE, 'w') f.close except: self.logger.error("existsDBSection Fail") config.read_file(codecs.open(self.SESSION_FILE, "r", "utf8")) section_name = db_sid + '_' + db_user if db_connected: if config.has_section(section_name): pass else: config.add_section(section_name) config[section_name]['s_group'] = db_sid config[section_name]['s_user_id'] = db_user if db_saved: config[section_name]['s_password'] = db_password else: config[section_name]['s_password'] = '' config[section_name]['b_saved'] = str(db_saved) with open(self.SESSION_FILE, 'w', encoding='utf-8') as configfile: config.write(configfile) else: if config.has_section(section_name): config[section_name]['s_group'] = db_sid config[section_name]['s_user_id'] = db_user if db_saved: config[section_name]['s_password'] = db_password else: config[section_name]['s_password'] = '' config[section_name]['b_saved'] = str(db_saved) with open(self.SESSION_FILE, 'w', encoding='utf-8') as configfile: config.write(configfile) def tw_dbListItemPressed(self, item): parentNode = item.parent() selectedNode = item if parentNode is not None: find_con = parentNode.text(0) + '_' + selectedNode.text(0) selectedRow = next(idx for idx, item in enumerate(self.connectionList) if item['sect'] == find_con) db = self.connectionList[selectedRow]['group'] user_id = self.connectionList[selectedRow]['user_id'] password = self.connectionList[selectedRow]['password'] saved = self.connectionList[selectedRow]['saved'] self.edt_user.setText(user_id) self.edt_password.setText(password) self.chk_dbSave.setChecked(saved) combo_idx = self.cb_dBName.findText(db) self.cb_dBName.setCurrentIndex(combo_idx)