在编写自动化脚本过程中,遇到过这样的问题,几个并行的控件结构中,你要通过控件其中的一部分,找到控件的另一部分。如下图所示:
像这样两个并列控件体,你要点击“和她交换真心话”时,就会出现多个,而不能定位是哪一个,当然这里是举例的2个,实际你可能有几个的个数都是不知道的(不过也可以通过测试数据的准备,进行控制,不出现这样复杂的环境)。这种情况,我们可以通过告诉我们“标题”,从而找到对应的后面的操作控件。比如告诉你“你能接受你的伴侣大你几年”,从而找到这个框内的“和她交换真心话”进行点击。
我们实现这样的查找,我想到有2个方法可以用。
第一:借助数据库。我们可以查看html源码,这种并列控件体中,操作控件和标题之间,一般是会有个关联属性的,目前我碰到的情况基本都是通过一个“ID”进行关联的,而这个“ID”可以通过“标题”在数据库中查找到。所以我们可以通过“标题”在数据库中找到对应的“ID”,然后通过这个“ID”准确找到我们真正需要操作的控件。
此方法,实现简单,分析关联属性,查找数据库,就可以定位到需要操作的控件。但频繁操作数据库,并不是可取的方式,另外对脚本的执行效率也会有影响。另外这个方法不是任何情况都适合,关联属性不一定能找到,关联属性的值不一定是从数据库得到。
record = DataOperate.get_one(”select id from poll_comments_s where content=’”+reviewcontent+”‘”) @ie.text_field(”id”,”commentContent:”+record['id'].to_s).set answercontent.to_s |
第二:利用DOM节点树。这种并列情况,并列的控件体,其内部结构是完全相同的,而且每个控件体内,都是结构相同的节点树。我们只要利用DOM节点树的遍历,就可以定位到该控件体内我们需要操作的控件。问题的关键是,我们一开始怎样定位到这个控件内的一个节点上,我们所知道,并不变的只有2点:1、节点树的结构;2、“标题”。所以我们只能通过“标题”定位到这棵节点树的一个节点上,然后根据节点树的结构,搜索到我们需要操作的控件。
此方法,是利用DOM节点树,因此它是适用范围是非常广泛的,而且不需要操作数据库,不会对脚本的执行效率有影响。
elementtest = @ie.locate_tagged_element(”A”,”text”,title) parent_element1=elementtest.parentNode parent_element2=parent_element1.parentNode parent_element3=parent_element2.parentNode elementdest1 = parent_element3.getElementsByTagName(”a”).item(1) elementdest1.click() |