哪怕你再精通selenium,陪伴测试人员最多的还是定位问题。


第一个坑:

    要定位的页面,出现html嵌套,也就是ifrmae。在html代码页面很直观的就能发现这个东西。实际就是在一个页面中引用了一个子页面。这样造成我们再用xpath或者css定位的时候直接找不到元素。这个时候我们需要用到一个新的东西来为她定位,其思路大体为:第一步,从父页面切换至子页面;第二步,在子页面定位元素;第三步,返回父页面(这个看个人需要,具体留在哪里需要结合实际)。

    第一步的实现需要用到一个方法:switch_to_frmae。具体用法可以参考代码。在此,我必须提醒大家一句,switch_to_frmae不一定管用,因为版本问题,可能会需要变为switch_to.frmae。一个‘_’,一个‘.’,这个坑我爬了好久啊。

    第二步就相对简单了,我们可以用firebug复制xpath或者css路径就可以了。值得注意的是,这次的路径是从子页面开始的,与父页面毫无关系,如果你想用id,class等等定位,应该也是可以的(当然我没试过,我对这句不负责)。

    第三步,返回,当我们不需要在这个子页面中进行定位的时候需要退出,这要一个新的方法,

switch_to.default_content()。具体内容可以百度或者参照我的代码贴图。
    至此,第一个坑跳出。
    
    定位元素时,一定要注意element还是elements,一个单数,一个复数,意义真是差别太大了。当你find_element_by_id('p')只是一个id = ‘p’的元素,find_elements_by_id('p')的时候其实是一堆id = 'p'组成的列表。切记自己想要一个还是多个元素,切记切记。
    我贴的代码,是我测试账号密码登录qq邮箱时候的问题,这次问题不在代码,可能是因为网络或者其他什么原因的问题,当我定位到qq邮箱‘登录’按钮时候,click()一直出现‘服务器繁忙的字样’,开始我认为是点击太快,我设置time.sleep(3)后依然如此(隐形等待我没有试,不过有兴趣的同学可以试试),为了解决这个问题,无奈的我只能先click(),再time.sleep(3)后,再click(),居然奇迹般的成功了。