• selenium让人摸不着头脑的问题


    selenium让人摸不着头脑的问题

    问题一 

    使用webdriver驱动firefox浏览器时如果不设置参数,默认使用的Firefox的profile和平时打开浏览器使用的firefox不一样,如果要使用平常使用的配置,解决方法:


    string sPath = @"C:UsersxxxxAppDataRoamingMozillaFirefoxProfiles5f3xae4a.default"; 
    FirefoxProfile ffprofile = new FirefoxProfile(sPath);


    sPath 是你的firefox浏览器的配置文件路径,如何获得这个路径,google一下你就知道。

    btw,火狐浏览器的profile还可能引起《selenium webdriver缺陷》中提到的获取页面元素的坐标错误问题,如果click无反应应该获取一下元素坐标,看是否是因为这个原因。


    问题二

    我之前一篇文章《selenium webdriver缺陷》介绍过,当页面上有js或者ajax等动态元素时,webdriver判断页面加载完成实际上只是html和js代码加载完成,js生成的元素是否已经出现在页面源码中是未知的,所以必须显示指明等待某元素出现,以判断这个元素是否已经被js等动态脚本生成:


    wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
    wait.Until(ExpectedConditions.ElementExists(by));



    问题三

    操作页面元 素时抛出异常,页面元素为不可见,无法操作。这个问题的原因我遇到二种,一种是css样式直接指定该元素或者父元素的display属性为none,解决 方法, 使用js注入直接修改元素的display属性为block,下面的代码是修改FindElements获取的多个元素的display属性。



    ReadOnlyCollection<IWebElement> eles = driver.FindElements(by);
    IJavaScriptExecutor js = driver as IJavaScriptExecutor;
    foreach (IWebElement ele in eles)
    {
        js.ExecuteScript("arguments[0].style.display='block';", ele);
    }



    第二种原因是js的问题,因为还没有输出完毕,获取到的元素有可能被提示为不可见,解决方法:

    线程sleep一定的时间等待它为可见,或者用webdriver的判断元素是否可见的方法,等待直到元素可见才执行之后的代码。(建议使用webdriver提供的方法)


    问题四

    操作元素时得到等待元素超时的异常。这个问题大多人第一反应可能是元素还没出现在页面源码中,例如问题二中提到的。但还有另外一个原因也会导致抛出这个异常,这是我今天做youtube自动上传模块遇到的情况。

    其实 webdriver对页面元素的所有操作都是通过将js代码注入到目标页面实现的(btw,为了实现这个目的webdriver使用了一个技巧避开了浏览 器的”同源策略“,这也是webdriver的一个创造性的地方,有兴趣可以google一下),那么就存在js脚本的执行顺序问题,youtube上传 页面需要执行js脚本以把文件上传到服务器,在整个文件上传的过程中,我代码中对页面元素的操作都会抛出超时异常,而且这个时候元素已经出现在页面源码中 了(我的程序中在操作元素之前获取了当时的页面源码,元素确实已经存在),所以不是因为元素不存在导致的超时,而是页面上的上传文件的js源码执行阻塞了 操作元素的webdriver的js源码的执行,直到超时报错,另外,如果由于对元素的操作本身时间过长,比如sendkey()一大堆的文字,当超过设 置的超时时限sendkey还没执行完毕也会得到这个异常。解决方法:

    因为不知道上传文件需要多久,所以如果元素的操作时机没什么限制的话,捕获异常后继续等待,直到操作成功为止。

    如果是因为元素自身操作超时,那么可以寻找不需要那么长执行时间的替代方案,或者加长超时时间保证操作有充足的执行时间。

    问题五

    driver初始化异常。我遇到过两种原因导致出现这个问题,一是firefox配置文件夹所在的硬盘分区空间不够,二是程序运行时有以webdriver以外的方法打开的firefox浏览器实例(比如双击firefox浏览器快捷方式打开)。解决方法:

    清理硬盘空间。先关闭导致问题产生的浏览器实例再运行程序。

    问题六

    元素click()之后,本该执行的操作顺利执行,但是程序却挂在click()方法中,直到抛出链接远程服务器超时异常。

    解决方法:在google code上很多老外都遇到这样的问题,似乎是一个selenium的bug,目前没有很好的解决方法,只能等到超时后捕获这个异常,继续下面的程序执行,为了缩短等待的时间,可以把这个超时时间设置得短一点:

    driver = new FirefoxDriver(new FirefoxBinary(), ffprofile, new TimeSpan(0, 0, 0, 60)); 最后一个参数就是设置对应的超时时间,这个超时时间不是隐式、显式等待以及scripttimeout,而且似乎也没办法在driver 初始化之后进行 改动。

  • 相关阅读:
    自己做的板子,电脑识别不出下载口(micro-usb),程序无法烧入
    博客园首页添加访问量
    python-day5爬虫基础之正则表达式2
    altium designer 画板 电子元器件的名称不能集体修改
    python-day4爬虫基础之正则表达式
    python-day3爬虫基础之下载网页
    python-day2爬虫基础之爬虫基本架构
    关于电脑识别不出自己画的板子上的USB接口问题
    python-day1 爬虫基础之HTTP基本原理
    PAT A1019 General Palindromic Number (20 分)——回文,进制转换
  • 原文地址:https://www.cnblogs.com/timssd/p/5101489.html
Copyright © 2020-2023  润新知