linkapi.py 4.6 KB

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