selenium让人摸不着头脑的问题

问题一

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

string sPath = @"C:\Users\xxxx\AppData\Roaming\Mozilla\Firefox\Profiles\5f3xae4a.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 初始化之后进行
改动。

selenium让人摸不着头脑的问题的更多相关文章

  1. 使用selenium 模拟人操作请求网页

    首先要 pip install selenium  安装插件 然后要下载驱动驱动根据你的浏览器 Chrome  selenium 驱动下载地址 http://chromedriver.storage. ...

  2. Selenium 模拟人输入

    public static void type(WebElement e,String str) throws InterruptedException { String[] singleCharac ...

  3. mysql 创建外键引用时眼瞎了,然而mysql 报的错也是认人摸不着头脑

    问题描述: 在创建外键约束时mysql 报 Create table 'tempdb/student' with foreign key constraint failed. There is no ...

  4. selenium + firefox/chrome/phantomjs登陆之模拟点击

    登陆之模拟点击 工具:python/java + selenium + firefox/chrome/phantomjs (1)windows开发环境搭建 默认已经安装好了firefox 安装pip ...

  5. Selenium Web 自动化

    1 Selenium Web 自动化 - Selenium(Java)环境搭建 2 Selenium Web 自动化 - 如何找到元素 3 Selenium Web 自动化 - Selenium常用A ...

  6. socket服务器开发中的SO_REUSEADDR选项与让人心烦的TIME_WAIT

    1 发现问题 我在开发一个socket服务器程序并反复调试的时候,发现了一个让人无比心烦的情况:每次kill掉该服务器进程并重新启动的时候,都会出现bind错误:error:98,Address al ...

  7. Selenium+Python浏览器调用:Firefox

    如何查看python selenium的API python -m pydoc -p  4567 说明: python -m pydoc表示打开pydoc模块,pydoc是查看python文档的首选工 ...

  8. selenium+java破解极验滑动验证码

    摘要 分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码. 人工验证的过程 打开威锋网注册页面(https://passport.feng.com/?r=user/r ...

  9. selenium+java破解极验滑动验证码的示例代码

    转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085  ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之1031猜数

          题目 解决代码及点评 /* 31. 猜号码∶由随机函数产生一个1至1000之间的整数,让人猜之. 计算机仅回答人猜的数大.小还是相等,当人猜对时, 由计算机打印出人 ...

  2. 【FAQ】SpingMVC实现集合參数(Could not instantiate bean class [java.util.List])

    需求,要求批量新增或者改动一个List,在Spring MVC中是不支持以下代码的写法 @RequestMapping(value = "/update", method = Re ...

  3. 改动导航栏上返回button上的字,比如把back改动为返回

    改动导航栏上返回button上的字,比如把back改动为返回 注意:这个须要在跳转之前到视图控制器中写,而不是在跳转之后到控制器中写 UIBarButtonItem *backIetm = [[UIB ...

  4. C#压缩与解压

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  5. 在O(1)时间删除指定链表结点

    #region 在O(1)时间删除指定链表结点 /// <summary> /// 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. /// </summa ...

  6. Basic4android:多功能的Android应用软件快速开发平台

    Basic4android 是目前最简单.最强大的Android平台快速应用开发工具. ( "Basic4android is the simplest and most powerful ...

  7. Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码

    在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现.下面要说的就是上次Scroller ...

  8. win7+Powerpoint2007下设置演讲者视图,两步搞定

    步骤1: 步骤2: 这样,你就可以对着ppt的备注讲解了,且用户看不到你的备注以及你的电脑桌面.cool!

  9. [知识库分享系列] 二、Web(高性能Web站点建设)

    知识库分享系列: [知识库分享系列] 二..NET(ASP.NET) [知识库分享系列] 一.开篇 分享介绍 此知识库之所以为 Web 系列,因为和 .NET 没有完全的关系,其中的技术和实践实用于各 ...

  10. OSX: 使用命令行对FileVault2分区恢复

    FileVault 2必须有Recovery HD分区,因为它依赖于它作为系统初启动.如果今后什么时候或者误操作删除了Recovery HD分区,那么你的机器就无法启动鸟. 是否使用苹果的办法重新获得 ...