linkapi.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. from hytest import *
  2. from playwright.sync_api import sync_playwright
  3. from PIL import Image, ImageChops
  4. from bs4 import BeautifulSoup
  5. import requests
  6. class APILink():
  7. headers = {
  8. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67;jy-test"
  9. }
  10. #headers设置为全局变量
  11. GSTORE['headers'] = headers
  12. # session对象设置为全局变量
  13. s = requests.Session()
  14. GSTORE['s'] = s
  15. #打开链接,返回title
  16. def obtain_url_title(self,url):
  17. headers=GSTORE['headers']
  18. s = GSTORE['s']
  19. response = s.get(url,headers=headers)
  20. response.encoding = 'utf-8' # 设置编码为utf-8
  21. if response.status_code == 200:
  22. soup = BeautifulSoup(response.text, 'html.parser')
  23. title_tag = soup.title
  24. if title_tag is not None:
  25. return title_tag.string
  26. else:
  27. return 'No title found'
  28. else:
  29. return 'Failed to retrieve content'
  30. #打开链接,status=200,返回true
  31. def open_url_status(self,url):
  32. headers=GSTORE['headers']
  33. s = GSTORE['s']
  34. response = s.get(url,headers=headers)
  35. status_code = response.status_code
  36. if status_code==200:
  37. return True
  38. else:
  39. return False
  40. #打开链接,返回页面底部某个值
  41. def obtain_url_bottom(self,url,loc):
  42. response = requests.get(url)
  43. response.encoding = 'utf-8' # 设置编码为gbk
  44. soup = BeautifulSoup(response.text, 'html.parser')
  45. # 查找元素并获取值
  46. element = soup.find('div', attrs={'class': loc})
  47. # element = soup.find(loc)
  48. element_value = element.text
  49. return element_value
  50. def setup(self):
  51. # 初始化 Playwright
  52. self.playwright = sync_playwright().start()
  53. self.browser = self.playwright.chromium.launch(headless=True)
  54. self.page = self.browser.new_page()
  55. def teardown(self):
  56. # 关闭浏览器
  57. self.browser.close()
  58. self.playwright.stop()
  59. def obtain_element_text(self,url,element):
  60. self.page.goto(url)
  61. # 等待元素出现
  62. self.page.wait_for_selector(element)
  63. # 查找元素
  64. element_handle = self.page.locator(element)
  65. # 获取元素的文本或属性值
  66. element_text = element_handle.text_content()
  67. # element_attribute = element_handle.get_attribute('属性名')
  68. # 设置超时时间
  69. self.page.wait_for_timeout(3000)
  70. return element_text
  71. # print(f'元素的属性值: {element_attribute}')
  72. #网页截图模糊遮罩方法,适用于网页有动态元素,进行遮罩比较
  73. def save_screenshot_mask(self,url, output_path, elements, clip=None):
  74. locs = []
  75. self.page.goto(url)
  76. for element in elements:
  77. loc = self.page.locator(element)
  78. locs.append(loc)
  79. self.page.screenshot(path=output_path,mask=locs, clip=clip)
  80. #网页直接截图方法,适用于网页元素不变,可直接截图比较
  81. def save_screenshot(self,url, output_path, clip=None):
  82. self.page.goto(url)
  83. self.page.screenshot(path=output_path, clip=clip)
  84. def compare_images(self, image1_path, image2_path):
  85. image1 = Image.open(image1_path)
  86. image2 = Image.open(image2_path)
  87. diff = ImageChops.difference(image1, image2)
  88. if diff.getbbox() is None:
  89. INFO("两张图片完全相同")
  90. return True
  91. else:
  92. INFO("两张图片存在差异")
  93. return False
  94. #对比样本快照与当前快照
  95. def contrast_snapshot(self,url,expected_screenshot,current_screenshot,clip):
  96. # 如果不存在样本照片,生成样本照片
  97. if not os.path.exists(expected_screenshot):
  98. self.save_screenshot(url, expected_screenshot,clip)
  99. INFO(f"样本快照已保存:{expected_screenshot}")
  100. #生成对比照片
  101. apilink.save_screenshot(url, current_screenshot,clip)
  102. INFO(f"对比快照已保存:{expected_screenshot}")
  103. #返回对比结果
  104. result = apilink.compare_images(current_screenshot, expected_screenshot)
  105. return result
  106. #对比样本快照与当前快照2
  107. def contrast_snapshot_mask(self,url,expected_screenshot,current_screenshot,element,clip):
  108. # 如果不存在样本照片,生成样本照片
  109. if not os.path.exists(expected_screenshot):
  110. self.save_screenshot_mask(url, expected_screenshot,element,clip)
  111. INFO(f"样本快照已保存:{expected_screenshot}")
  112. #生成对比照片
  113. apilink.save_screenshot_mask(url, current_screenshot,element,clip)
  114. INFO(f"对比快照已保存:{expected_screenshot}")
  115. #返回对比结果
  116. result = apilink.compare_images(current_screenshot, expected_screenshot)
  117. return result
  118. apilink = APILink()