# coding = utf-8 from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC import time import os from selenium.webdriver.support.select import Select from read_init import ReadIni from selenium.webdriver.common.keys import Keys from handle_json import handle_json #類使用 class SelenimuDriver(): def __init__(self): self.driver = self.open_browser() def open_browser(self,browser='chrome'): try: if browser == 'chrome': driver = webdriver.Chrome() elif browser == 'firefox': driver = webdriver.Firefox() elif browser == 'ie': driver = webdriver.Ie() else: driver = webdriver.Edge() time.sleep(1) return driver except: print("open browser fail!") return None def get_url(self,url): if self.driver !=None: self.driver.maximize_window() if 'http://' in url: self.driver.get(url) else: print("Your url have a problem!") else: print('can\'t get browser') self.driver.quit() def handle_windows(self,*args): value = len(args) if value == 1: if args[0] == 'max': self.driver.maximize_window() elif args[0] == 'min': self.driver.minimize_window() elif args[0] == 'back': self.driver.back() elif args[0] == 'go': self.driver.forward() elif args[0] == 'refresh': self.driver.refresh() else: print('don\'t have this operating') elif value == 2: self. driver.set_window_size(args[0],args[1]) else: print('You Parameters is error!') time.sleep(4) self.driver.quit() def assert_title(self,title_name = None): ''' 判斷title是否正確 :param title_name: :return: get_title() ''' if title_name != None: get_title = EC.title_contains(title_name) return get_title(self.driver) def open_url_is_true(self,url,title_name = None): self.get_url(url) return self.assert_title(title_name) def close_driver(self): self.driver.close() def switch_windows(self,title_name=None): ''' 切換windows :param title_name: :return: ''' handle_list = self.driver.window_handles current_handle = self.driver.current_window_handle for i in handle_list: if i != current_handle: time.sleep(2) self.driver.switch_to.window(i) if self.assert_title(title_name): break time.sleep(2) self.driver.find_element_by_id('userId').send_keys('test') time.sleep(2) def element_isdisplay(self,element): flag = element.is_displayed() if flag == True: return element else: return False def get_element(self,info): ''' 獲取元素element :param by: :param value: :return: ''' try: by,value = self.get_local_element('username') element = None if by == 'id': element = self.driver.find_element_by_id(value) elif by == 'name': element = self.driver.find_element_by_name(value) elif by == 'css': element == self.driver.find_element_by_css_selector(value) elif by == 'class': element == self.driver.fing_element_by_class_name(value) else: element == self.driver.find_element_by_xpath(value) except: print("定位方式:", by ,"定位值",value,"定位出現錯誤,沒有定位成功") return self.element_isdisplay(element) def elements_isdisplay(self,elements): flag_list = [] flags = elements.is_displayed() for flag in flags: if flag == False: continue else: flag_list.append(flag) return flag_list def get_elements(self,info): ''' 獲取元素element :param by: :param value: :return: ''' try: elements = None elements = [] by,value = self.get_local_element(info) if by == 'id': elements = self.driver.find_elements_by_id(value) elif by == 'name': elements = self.driver.find_elements_by_name(value) elif by == 'css': elements == self.driver.find_elements_by_css_selector(value) elif by == 'class': elements == self.driver.fing_elements_by_class_name(value) else: elements == self.driver.find_elements_by_xpath(value) except: print("定位方式:",by,"定位值",value,"定位出現錯誤,沒有定位成功") return self.elements_isdisplay(elements) def get_list_element(self,info,index): elements = self.get_elements(info) if index > len(elements): return None return elements[index] def get_level_element(self,info_level,node_info): ''' :param by: :param value: :param node_by: :param node_value: :return: ''' element = self.get_element(info_level) node_by,node_value = node_info if element == False: return False if node_by == 'id': node_element = element.find_element_by_id(node_value) elif node_by =='name': node_element = element.find_element_by_name(node_value) elif node_by =='css': node_element = element.find_element_by_css_selector(node_value) elif node_by =='class': node_element = element.find_element_by_class_name(node_value) else: node_element = element.find_element_by_xpath(node_value) return self.element_isdisplay(node_element) def assert_element(self,element): pass def send_value(self,by,value,key): ''' 輸入值 ''' element = self.get_element(by,value) if element == False: print("輸入失敗,定位元素不可編輯") else: if element != None: element.send_keys(key) else: print("輸入失敗,定位元素沒找打") def click_element(self,info): ''' 點擊元素 :param by: :param value: :return: ''' element = self.get_element(info) if element != False: if element != None: element.click() else: print("點擊失敗,定位元素沒有找到") else: print("點擊失敗,元素不可見") def check_box_isselected(self,info,check = None): element = self.get_element(info) if element != False: flag = element.is_selected() if flag == True: if check != 'check': self.click_element(info) else: if check == 'check': self.click_element(info) else: print("元素不可見,沒辦法選擇") def get_local_element(self,info): data = ReadIni.get_value(info) data_info = data.split('>') # print(data_info) # by = data_info[0] # local = data_info[1] #[name,email] return data_info def get_selected(self,info,value_index,index=None): ''' 通過index獲取我們seleced,然后選擇我們selected :param info: :param value_index: :param index: :return: ''' selected_element = None if index != None: selected_element = self.get_list_element(info,index) else: selected_element = self.get_element(info) Select(selected_element).select_by_index(value_index) def upload_file(self,file_name): ''' 上傳文件 :param file_name: :return: ''' pykey = PyKeyboard() # pykey.tap_key(pykey.shift_key) pykey.type_string("D:\\download\\test.png") time.sleep(2) pykey.tap_key(pykey.enter_key) def upload_file_function(self,file_name): pass # 先獲取到上傳文件的元素標簽類型(input file) send_keys上傳文件 def calendar(self,info,value): ''' 修改日歷 :param info: :param value: :return: ''' element = self.get_element(info) try: element.get_attribute('readonly') self.js_excute_calendar(info) except: print("這個不是只讀熟悉的日歷") element.clear() self.send_value(info.value) def moveto_element_mouse(self,info): ''' 移動鼠標 :param info: :return: ''' element = self.get_element(info) ActionChains(self.driver).move_to_element(element).perform() def refresh_f5(self): ''' 強制刷新 ''' ActionChains(self.driver).key_down(Keys.CONTROL).send_keys(Keys.F5).key_up(Keys.CONTROL).perform() def switch_iframe(self,info,tag=None): ''' 切換iframe :param info: :param tag: :return: ''' if info != None: iframe_element = self.get_element(info) self.driver.switch_to.frame(iframe_element) else: self.driver.switch_to.default_content() def switch_alert(self,info,value=None): ''' 系統級彈窗 :param info: 確認or取消 :param value: 是否需要輸入值 :return: ''' windows_alert = self.driver.switch_to.alert if info == 'accept': if value == None: windows_alert.accept() else: windows_alert.send_keys(value) windows_alert.accept() windows_alert.accept() else: windows_alert.dismiss() def scroll_get_element(self,list_info,str_info): t = True list_element = self.get_elements(list_info) js = 'document.documentElement.scrollTop = 100000;' while t: for element in list_element: title_name = element.find_element_by_tag_name('p').text if title_name in str_info: element.click() t = False self.driver.execute_script(js) time.sleep(3) def scroll_element(self,info): js = 'document.documentElement.scrollTop = 1000;' t = True while t: try: self.get_element(info) t = False except: self.driver.execute_script(js) def get_cookie(self): cookie = self.driver.get_cookies() handle_json.write_data(cookie) def set_cookie(self): cookie = handle_json.get_data() self.driver.delete_all_cookies() time.sleep(1) self.driver.add_cookie(cookie) time.sleep(2) def save_png(self): now_time = time.strftime('%Y%m%d.%H.%M.%S') self.driver.get_screenshot_as_file('%s.png' %now_time) if __name__ == '__main__': os.system("taskkill /f /im chromedriver.exe") selfnium_driver = SelenimuDriver() #*************************測試方法 # selfnium_driver.open_browser() # print(selfnium_driver.open_url_is_true('http://www.imooc.com','程序員')) # time.sleep(30) # selfnium_driver.switch_windows('網站連接')