在Clicknium使用指南1 中介绍了Clicknium的基本概念和使用方法。本章将更深入的介绍Clicknium的高级功能。
1. 获取相似元素(Similar elements)
我们经常需要处理网页或应用中大量相似的元素,例如List和Grid中的UI元素。 依次抓取这些元素会产生大量的locator,显然不是一个好方法。 有用户甚至提问,将同一类locator放在了一个文件夹下,怎么能遍历locator文件夹。 当然,采用之前提到了参数化locator也是一种做法。但是,一方面你需要分析是用哪个属性和什么值来遍历UI元素,另一方面,参数的范围很可能不得而知,尤其随着应用越来越复杂,越来越多采用动态加载的方式导致要抓取的UI元素总量无法预测。 通常我们会使用 BeautifulSoup这类的库来解析网站的HTML结构,由于网站的样式越来越复杂,抓取的内容并不会总是在同一个结构中, 每个Item可能被多层div或者其他元素包裹,所以在解析时,我们需要分析HTML的结构并构建一个算法找所有元素的最小公共节点,并且遍历该结构。 这一过程确实比较花时间, 同时也是一个能被算法解决的问题。
Clicknium Recorder中,包含了抓取相似元素的功能。 用户通过抓取两个相似(同一层级)的元素, Clicknium内置算法自动解析HTML结构,并计算最小公共节点和层级信息 ,以实现抓取相似元素。 如果计算出来的元素并不是用户想要的,可进行第三次抓取,算法将通过三个UI元素的信息,重新计算抓取路径。
1.1 使用方法:
以Opensea中Okay Bear图片为例,这是一个典型的Grid结构:
a. 点击VS Code 插件中的Capture 按钮,启动录制器:
b. 点击录制器中的Similar elements:
c. Ctrl +鼠标单击抓取第一和第二个元素:
抓取到相似元素对应的locator后, 调用find_elements返回一个UI element List(find_element返回单个UI element。
Sample code:
使用get_property获取图片地址后,通过request下载图片,并通过send_hotkey触发PgDn下滑加载图片。
import requests
from time import sleep
from clicknium import clicknium as cc, locator
def main():
cc.chrome.open("https://opensea.io/collection/okay-bears")
nftDic = {}
while True:
newDic = {}
finish = True
sleep(4)
nfts = cc.find_elements(locator.sample.opensea.img_okay_bear)
for nft in nfts:
src = nft.get_property("src")
name = nft.get_property("alt")
if name not in nftDic:
newDic[name]=src
finish = False
for key,value in newDic.items():
r = requests.get(value)
print("Downloading:"+ key)
imagePath