selenium全自动获取控件定位方式,完美解决ui频繁变动模块

大家可以看我另一篇博客,关于此功能已经发布pip工具 wqrfnium了。有兴趣可以下了玩玩
https://blog.csdn.net/qq_22795513/article/details/102402169

抱歉搁置了这么久。
现在开始:
1。对于任何控件,我先把其放在了一张表中,类似于对象库的概念,表中存储了该元素的主键(我们以后只根据主键去调用元素),元素的源码(直接在浏览器中复制到表即可,程序会自动解析并定位)。目前仅是第一版,存在很多很多优化点,但是因为时间不足,目前没有继续优化,后续可能会持续改进,
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YkU3V7TE-1570701497456)(https://img-blog.csdn.net/20170801181506730?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjI3OTU1MTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
2。调用的时候,仅需要用do函数,do函数需要3个参数: driver,控件主键,动作。其中动作 可以是click,text,各种字符串 或value,其中click是直接点击,text是获取text,各种字符串是输入各种字符串,value是获取其value的值。这里我们可以任意添加 并定义其功能。
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZATdZLN-1570701497457)(https://img-blog.csdn.net/20170801181809928?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjI3OTU1MTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
怎样,看起来是不是简便很多。而且这些代码写完后,再也不用改了,控件元素若有变更,那直接去对象库那个表中改就可以了,当然。怎么改是有一个算法可以帮助我们自动去改的,但因为目前第一版本效果不是很好,顾暂不放出来丢人了。
3。录入,目前第一版本录入是纯靠手动,第二版本已经引入了获取xml源码自动录入,目前还在优化中,暂时不放出了。
4。定位,算法中有一个功能,是自动解析xml源码,并按最优顺序进行试探定位,每找到一个,就开始获取其控件的全部属性,和源码对比。若完全一样,则马上返回这个控件,若有不一样的,就用其他办法继续定位,最终选出一个完全一样的。但是控件源码中有些属性是会变动的,所以这里需要有一个过滤属性,这个属性最好自己手动指定。
下面上定位算法:


def dingwei(driver,str1):
    '定位功能方法'
    driver.implicitly_wait(10)
    str2=str1
    panduan = re.findall(r'\xa0(.*?)=', str2)
    for i in range(len(panduan)):
        panduan[i]=panduan[i].split(' ')[-1]
    daan = re.findall(r'="(.*?)"',str2)
    try:
        id = re.findall(r'id="(.*?)"',str2)[0]
        elements = driver.find_elements_by_id(id)

        for i in elements:
            for j in range(len(panduan)):
                if i.get_attribute(panduan[j]) != daan[j]:
                    if panduan[j] == 'value' or panduan[j] == 'readonly' or panduan[j]=='title':
                        continue
                    else:
                        print u'属性名:',panduan[j]
                        print u'id定位:',i.get_attribute(panduan[j]),'XXX',daan[j]
                        break
            else:
                print u'id成功定位: ',id
                return i
    except Exception,e:
        print u'id未找到'


    try:
        name = re.findall(r'name="(.*)"',str2)[0]
        elements = driver.find_elements_by_name(name)
        for i in elements:
            for j in range(len(panduan)):
                if i.get_attribute(panduan[j]) != daan[j]:
                    if panduan[j] == 'value':
                        continue
                    else:
                        print u'属性名:', panduan[j]
                        print u'name定位',i.get_attribute(panduan[j]), 'XXX', daan[j]
                        break
            else:
                print u'name成功定位: ', name
                return i
    except Exception, e:
        print U'name未找到'

    try:
        link_text = re.findall(r'>(.*)<',str2)[0]
        elements = driver.find_elements_by_link_text(link_text)
        for i in elements:
            for j in range(len(panduan)):
                if i.get_attribute(panduan[j]) != daan[j]:
                    if panduan[j] == 'value':
                        continue
                    else:
                        print u'属性名:', panduan[j]
                        print u'link_text定位:',i.get_attribute(panduan[j]), 'XXX', daan[j]
                        break
            else:
                print u'link_text成功定位: ', link_text
                return i
    except Exception, e:
        print u'link_text未找到'

    try:
        class_name = re.findall(r'class="(.*?)"', str2)[0].split(' ')[-1]
        elements = driver.find_elements_by_class_name(class_name)
        for i in elements:
            for j in range(len(panduan)):
                if i.get_attribute(panduan[j]) != daan[j]:
                    if panduan[j] == 'value':
                        continue
                    else:
                        print u'属性名:', panduan[j]
                        print u'class_name定位:',i.get_attribute(panduan[j]), 'XXX', daan[j]
                        break
            else:
                print u'class_name成功定位: ', class_name
                return i
    except Exception, e:
        print u'class_name未找到'

    print u'这个控件实在是找不到了....'
    exit()

我这个版本,其实用起来还没有达到真正全自动的程度(其实差的很远),但是目前来说,应对元素频繁变更,有很好的效果。也提出了对象库概念和自动定位

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我去热饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值