ctrip.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from error import error
  4. import logging
  5. import time
  6. from selenium.common import exceptions
  7. from selenium.webdriver.common.by import By
  8. class Ctrip:
  9. def __init__(self):
  10. self.index = "http://www.ctrip.com/" # 初始化携程的首页地址
  11. self.driver = webdriver.Chrome() # 浏览器对象,之后所有自动化测试操作都会用到该对象
  12. def login(self):
  13. # 进入登录页
  14. print('----------------进入登录页')
  15. time.sleep(2)
  16. login_btn = self.driver.find_element(By.XPATH, '//*[@id="hp_nfes_accountbar"]/li[1]/div/button/div')
  17. if not login_btn:
  18. err = '找不到登录按钮'
  19. logging.error(err)
  20. return err
  21. login_btn.click()
  22. time.sleep(2)
  23. code_btns = self.driver.find_elements(By.CLASS_NAME, 'login-entry-dynamic')
  24. if len(code_btns) > 0:
  25. code_btn = code_btns[0]
  26. else:
  27. err = '找不到切换手机验证码按钮'
  28. logging.error(err)
  29. return err
  30. # 切换到手机号登录
  31. time.sleep(2)
  32. code_btn.click()
  33. # 输入账号和发送验证码
  34. dyphone = self.driver.find_element(By.ID, 'dyphone')
  35. if not dyphone:
  36. err = '找不到电话输入框'
  37. logging.error(err)
  38. return err
  39. time.sleep(2)
  40. dyphone.send_keys('15626215750')
  41. # 发送验证码按钮
  42. sdy = self.driver.find_element(By.ID, 'sdy')
  43. if not sdy:
  44. err = '找不到发送验证码按钮'
  45. logging.error(err)
  46. return err
  47. time.sleep(2)
  48. sdy.click()
  49. # 关闭滑动验证码
  50. time.sleep(2)
  51. slider = self.driver.find_element(By.XPATH, '//*[@id="sliderdddynamic"]/div/div[1]/div[2]/div')
  52. if not slider:
  53. err = '找不到验证码关闭按钮'
  54. logging.error(err)
  55. return err
  56. slider.click()
  57. # 切换到账号密码登录
  58. time.sleep(3)
  59. go_prev_step = self.driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div[2]/div/div[1]/div[3]/form/a')
  60. if not go_prev_step:
  61. err = '找不到返回账号登录按钮'
  62. logging.error(err)
  63. return err
  64. time.sleep(2)
  65. go_prev_step.click()
  66. # 输入账号密码
  67. time.sleep(2)
  68. nloginname = self.driver.find_element(By.ID, 'nloginname')
  69. npwd = self.driver.find_element(By.ID, 'npwd')
  70. nloginname.send_keys('15626215750')
  71. time.sleep(1)
  72. npwd.send_keys('SFPbP3iW')
  73. time.sleep(2)
  74. nsubmit = self.driver.find_element(By.ID, 'nsubmit')
  75. nsubmit.click()
  76. # 测试机票
  77. def air_ticket(self):
  78. self.close_advert()
  79. try:
  80. nav_flight = self.driver.find_element_by_id("nav_flight")
  81. except (exceptions.NoSuchElementException, exceptions.WebDriverException) as e:
  82. return error.new("air_ticket find element with id(%s) error: %s", "nav_flight", e.msg)
  83. nav_flight.click()
  84. time.sleep(5)
  85. try:
  86. search_btn = self.driver.find_element_by_id("search_btn")
  87. except (exceptions.NoSuchElementException, exceptions.WebDriverException) as e:
  88. return error.new("air_ticket find element with id(%s) error: %s", "search_btn", e.msg)
  89. search_btn.click()
  90. time.sleep(5)
  91. return None
  92. # 测试火车票
  93. def railway_ticket(self):
  94. self.close_advert()
  95. try:
  96. nav_trains = self.driver.find_element_by_id("nav_trains")
  97. except (exceptions.NoSuchElementException, exceptions.WebDriverException) as e:
  98. return error.new("railway_ticket find element with id(%s) error: %s", "nav_trains", e.msg)
  99. nav_trains.click()
  100. time.sleep(5)
  101. try:
  102. searchbtn = self.driver.find_element_by_id("searchbtn")
  103. except (exceptions.NoSuchElementException, exceptions.WebDriverException) as e:
  104. return error.new("air_ticket find element with id(%s) error: %s", "searchbtn", e.msg)
  105. # 关闭携程打开时底下的广告
  106. def close_advert(self):
  107. time.sleep(5)
  108. try:
  109. appd_wrap_close = self.driver.find_element_by_id("appd_wrap_close")
  110. except (exceptions.NoSuchElementException, exceptions.WebDriverException) as e:
  111. logging.debug("close_advert close advert with id(%s) not found", "appd_wrap_close")
  112. try:
  113. appd_wrap_close.click()
  114. except exceptions.ElementNotVisibleException:
  115. logging.error("close_advert find advert success and it maybe already closed")
  116. # 由于测试会使用浏览器或则占用其他资源,可在close中释放所有占用的资源
  117. def close(self):
  118. if self.driver is not None:
  119. self.driver.close()
  120. # 开始测试
  121. # 该方法有一个返回值,即测试的错误信息,如果返回值为None,则测试成功
  122. def run(self):
  123. if len(self.index) < 1:
  124. return error.new("Ctrip auto test error with empty index.")
  125. self.driver.get(self.index)
  126. # self.close_advert()
  127. print('----------------打开了页面')
  128. err = self.login()
  129. if err:
  130. logging.error('Ctrip login err', err)
  131. return err
  132. # err = self.air_ticket()
  133. # if err is not None:
  134. # logging.error("Ctrip test air_ticket with index(%s) error: %s", self.index, err.to_string())
  135. # return err
  136. #
  137. # err = self.railway_ticket()
  138. # if err is not None:
  139. # logging.error("Ctrip test railway_ticket with index(%s) error: %s", self.index, err.to_string())
  140. # return err
  141. return None