1 # -*- coding:utf-8 -*- 2 from selenium import webdriver 3 import time 4 5 OVER_TIME = 5 6 BASE_URL = "https://passport.cnblogs.com/user/signin?ReturnUrl=https%3A%2F%2Fwww.cnblogs.com%2F" 7 8 9 class Driver(object): 10 11 def __new__(cls, *args, **kw): 12 """ 13 使用单例模式将类设置为运行时只有一个实例,在其他Python类中使用基类时, 14 可以创建多个对象,保证所有的对象都是基于一个浏览器 15 """ 16 if not hasattr(cls, '_instance'): 17 orig = super(Driver, cls) 18 cls._instance = orig.__new__(cls, *args, **kw) 19 return cls._instance 20 21 def start(self, url=BASE_URL, driver_name="Firefox"): 22 """ 23 启动浏览器 24 :param url: 测试地址 25 :param driver_name: 在启动时设置浏览器的类型 26 :return: 27 """ 28 if driver_name == "Firefox": 29 self.driver = webdriver.Firefox() 30 elif driver_name == "Ie": 31 self.driver = webdriver.Ie() 32 else: 33 self.driver = webdriver.Chrome() 34 self.driver.implicitly_wait(OVER_TIME) 35 self.driver.get(url) 36 self.driver.maximize_window() 37 38 def get_url(self): 39 """返回浏览器的地址""" 40 return BASE_URL 41 42 def find_element(self, by, value): 43 """ 44 这里添加了一个OVER_TIME作为查找元素的超时次数,根据系统的实际情况设置OVER_TIME的大小 45 """ 46 for i in range(OVER_TIME): 47 try: 48 return self.driver.find_element(by=by, value=value) 49 except Exception as e: 50 print(e) 51 52 def find_elements(self, by, value): 53 """与find_element一致""" 54 for i in range(OVER_TIME): 55 try: 56 return self.driver.find_elements(by=by, value=value) 57 except Exception as e: 58 print(e) 59 60 def find_display_elements(self, by, value): 61 """ 62 查找状态为displayed的元素集合,当查找一类元素时, 63 经常出现有些元素是不可见的情况,此函数屏蔽那些不可见的元素 64 """ 65 for i in range(OVER_TIME): 66 try: 67 elements = self.driver.find_elements(by=by, value=value) 68 num = elements.__len__() 69 except Exception as e: 70 print(e) 71 time.sleep(1) 72 if num >= 1: 73 break 74 display_element = [] 75 # 将可见的元素放到列表中, 并返回 76 for j in range(num): 77 element = elements.__getitem__(j) 78 if element.is_displayed(): 79 display_element.append(element) 80 return display_element 81 82 def is_element_present(self, By, Value): 83 """判断元素是否存在""" 84 try: 85 self.driver.find_element(by=By, value=Value) 86 return True 87 except Exception as e: 88 print(e) 89 return False 90 91 def close(self): 92 self.driver.close() 93 94 def quit(self): 95 u"""退出浏览器""" 96 self.driver.quit() 97 98 if __name__ == "__main__": 99 page = Driver() 100 page.start()