网页元素高级操作

下面介绍一些JDA关于网页元素的高级操作,包括用索引批量查询元素和在大元素范围内查找子元素。

1. 元素属性

录制元素时,在录制窗口中只显示定位元素所默认需要的属性,点击“显示所有属性”可以列出元素所有被录制的属性。如下图,录制后默认只显示@selector和outertext两个属性,显示所有属性后会显示@selector,class,outertext,tag四个属性。

显示默认属性

显示所有属性

JDA支持四种元素查找方式,按生效优先级排序分别为:选择器,id,class,XPath。

选择器

选择器是JDA查询元素优先级最高的方式,在属性中以@selector表示,是录制元素后默认显示的属性。选择器采用的是css选择器的语法,可以和@text属性或outertext属性配合使用,而其他属性在选择器属性存在时都会被忽略。

id

若属性中没有选择器时,JDA会优先使用id属性选择元素。id对应网页元素标签的id属性,查找结果会再用其他属性进行匹配,返回第一个匹配的元素。

class

若属性中没有选择器和id,JDA会优先使用class属性选择元素。class对应网页元素标签的class属性,查找结果会再用其他属性进行匹配,返回所有匹配的元素。

XPath

若以上三种属性都不存在,JDA会将所有属性拼装成XPath格式进行查询,返回所有匹配的元素。若属性不能拼装成合法的XPath格式,查询将失败。

2. 属性编辑

录制元素后,可以通过手动修改属性的值或添加自定义属性。

修改属性

录制后的选择器可以通过手动修改,调整其查询范围。如下图所示,录制后选择器的值为div#J_cate > ul > li:nth-child(1) > a,只能匹配1个元素,将其修改为div#J_cate > ul > li > a,则会匹配54个元素。

修改前

修改后

添加自定义属性

通过添加自定义属性,可以手动输入新的属性,为查询结果增加筛选范围。如下图,在选择器属性下,新增一个@text属性,值为“产”,运算符选择正则匹配,添加属性前会匹配54个元素,添加后只会匹配2元素。

添加属性

属性一览

以下列出元素录制常用的属性

  • @selector:选择器,用来查找元素。
  • @text: 自定义文本,由用户输入,支持“等于”和“正则匹配”两种运算符。
  • outertext:录制的元素文本,支持“等于”和“正则匹配”两种运算符。
  • id:网页元素的id属性。
  • class:网页元素的class属性。
  • tag:网页元素的标签名,可以用来拼装XPath。
  • html属性:网页元素的属性,包括type、value、name、title、href、src和alt等。

3. 元素中查询子元素

JDA默认是在整个网页文档中查询元素,但也支持在一个元素的子节点范围中查询元素,可以缩小查询范围,使查询更加精准和高效。

选择外层元素

通过录制一个网页元素来作为外层元素,即可用rpa_browser_getElement接口获得这个元素的描述符。下面演示了如何批量选择外层元素。

  1. 在网页中录制一个节点,选择器为:div#J_goodsList > ul > li:nth-child(1) > div。

    商品项

  2. 修改属性,删除outertext,选择器改为:div#J_goodsList > ul > li > div。

    列表项

  3. 先通过rpa_browser_getElementCount接口获取页面上元素的个数,再通过循环用索引查找这些元素。

    #获取页面上商品的数目
    count = rpa_browser_getElementCount(tabId, "商品项", waitElement=False)
    #遍历所有商品
    for i in range(count):
        #通过索引i获取商品单元
        #外层元素,限制子元素查询范围
        parentEle = rpa_browser_getElement(tabId, "商品项", i, waitElement=False)
    

查询子元素

获取外层元素描述符后,将其作为parentElement参数传入元素操作接口,即可实现在parentElement范围内查找元素。下面演示如何在外层元素中查询子元素。

  1. 录制价格节点,选择器为:div#J_goodsList > ul > li:nth-child(1) > div > div.p-price > strong。

    商品价格

  2. 修改属性,删除outertext,选择器改为:div.p-price。

    价格列表

  3. 同理录制商品名称和商家节点,选择器分别为:div.p-name,div.p-shopnum。

  4. 利用已经得到的外层元素描述符,查找子元素。

    #外层元素,限制子元素查询范围
    parentEle = rpa_browser_getElement(tabId, "商品项", i, waitElement=False)
    #获取商品名称
    name = rpa_browser_getElementText(tabId, "商品名称", index=0, waitElement=False, parentElement=parentEle)
    #获取商品商家名称
    publish = rpa_browser_getElementText(tabId, "商家", index=0, waitElement=False, parentElement=parentEle)
    #获取商品价格
    price = rpa_browser_getElementText(tabId, "商品价格", index=0, waitElement=False, parentElement=parentEle)
    

4. 完整代码示例

#打开京东主站
tabId = rpa_browser_openUrl("https://www.jd.com")
#搜索四大名著
rpa_browser_setInputText(tabId, "搜索框", "四大名著", index=0, waitElement=False, parentElement="")
rpa_browser_clickElement(tabId, "搜索按钮", index=0, waitElement=False, parentElement="")
#等待搜索完成
rpa_browser_waitLoadEnd(tabId)
#获取页面上商品的数目
count = rpa_browser_getElementCount(tabId, "商品项", waitElement=False)
#遍历所有商品
for i in range(count):
    #通过索引i获取商品单元
    #外层元素,限制子元素查询范围
    parentEle = rpa_browser_getElement(tabId, "商品项", i, waitElement=False)
    #获取商品名称
    name = rpa_browser_getElementText(tabId, "商品名称", index=0, waitElement=False, parentElement=parentEle)
    #获取商品商家名称
    publish = rpa_browser_getElementText(tabId, "商家", index=0, waitElement=False, parentElement=parentEle)
    #获取商品价格
    price = rpa_browser_getElementText(tabId, "商品价格", index=0, waitElement=False, parentElement=parentEle)
    #将结果写入表格中
    rpa_view_createRow(name)
    rpa_view_writeTable(i, 1, publish)
    rpa_view_writeTable(i, 2, price)
powered by Gitbook修订时间: 2021-04-15 15:56:54

找到相关内容

    未找到""相关内容

    找到相关内容

      未找到""相关内容