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="Chrome"):
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, 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, 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, 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, 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()