python selenium对象封装_selenium基础框架的封装(Python版)

在使用selenium做web自动化测试的过程中,经常会碰到各种各样的问题,比如:

1、页面加载比较慢时,selenium查找元素抛出异常,导致脚本运行中止

2、写完脚本后发现代码逻辑不够清晰,维护困难,降低测试效率

所以很有必要对selenium进行封装使框架更适合公司的需求,下面是基类的封装,主要使用单例模式,可以将业务逻辑代码存放在不同的Python文件中

注:BASE_URL为博客园的登录地址

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()

二、使用封装过的框架和pageobject模式设计登录脚本

1 # -*- coding:utf-8 -*-

2 from webdriver import Driver

3 from selenium.webdriver.common.by import By

4

5

6 class Login(object):

7

8 def __init__(self, user_name="xxx", pwd="xxx"):

9 self.page = Driver()

10 page = self.page

11 page.start(url=page.get_url())

12 self.user_name = page.find_element(By.ID, "input1")

13 self.pwd = page.find_element(By.ID, "input2")

14 self.login_btn = page.find_element(By.ID, "signin")

15 self.login(user_name, pwd)

16

17 def login(self, user_name, pwd):

18 self.user_name.clear()

19 self.user_name.send_keys(user_name)

20 self.pwd.clear()

21 self.pwd.send_keys(pwd)

22 self.login_btn.click()

23

24

25 if __name__ == "__main__":

26 Login("xxx", "xxx")

三、打开博客园新闻、博问等子页面脚本设计

1 # -*- coding:utf-8 -*-

2 from webdriver import Driver

3 from login import Login

4 from selenium.webdriver.common.by import By

5

6

7 class SubPage(object):

8

9 def __init__(self):

10 self.page = Driver()

11 page = self.page

12 self.home_page = page.find_element(By.LINK_TEXT, u"园子")

13 self.news_page = page.find_element(By.LINK_TEXT, u"新闻")

14 self.q_page = page.find_element(By.LINK_TEXT, u"博问")

15 self.ing_page = page.find_element(By.LINK_TEXT, u"闪存")

16

17 def open_home_page(self):

18 self.home_page.click()

19

20 def open_news_page(self):

21 self.news_page.click()

22

23 def open_q_page(self):

24 self.q_page.click()

25

26 def open_ing_page(self):

27 self.ing_page.click()

28

29

30 if __name__ == '__main__':

31 Login("xxx", "xxx")

32 sub = SubPage()

33 sub.open_q_page()

四、其他

按照此模式博友可根据公司具体的业务来实现自动化测试脚本,本文抛砖引玉,如有其他更好的想法可以一起探讨

转载

https://www.cnblogs.com/fightever/p/6867619.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值