linkapi.py 4.6 KB

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