Selenium WebDriver学习笔记一

Selenium是web自动化测试框架,从2.0版本后加入了webdriver功能, 可以用java,python等主流语言完全操控浏览器进行自动化测试,功能非常强大。

下面演示一个很简单的例子,就是通过webdriver打开一个浏览器,然后访问google,搜索一个字符串,再显示结果页面的title。例子都是从selenium文档里抄的,语言为java。

  1. 安装jdk,maven(记得设置JAVA_HOME, M2_HOME宏)
  2. 在firefox安装selenium的插件
  3. 新建工程目录,创建pom.xml,内容如下
    
    
            4.0.0
            MySel20Proj
            MySel20Proj
            1.0
            
                UTF-8
            
            
                
                    org.seleniumhq.selenium
                    selenium-java
                    2.37.0
                
                
                    com.opera
                    operadriver
                
            
            
                
                    
                        com.opera
                        operadriver
                        1.5
                        
                            
                                org.seleniumhq.selenium
                                selenium-remote-driver
                            
                        
                    
                
            
    
    
    
  4. 在目录里执行: mvn clean install
  5. 在Idea里import新生成的maven project
  6. 创建子目录 src\main\java\org.openqa.selenium
  7. 在子目录下创建文件Selenium2Example.java, 内容如下
    package org.openqa.selenium.example;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedCondition;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class Selenium2Example  {
        static WebDriver driver ;
    
        public static void main(String[] args) {
            // Create a new instance of the Firefox driver
            // Notice that the remainder of the code relies on the interface,
            // not the implementation.
            driver = new FirefoxDriver();
    
            // And now use this to visit Google
            driver.get("http://www.google.com");
            // Alternatively the same thing can be done like this
            // driver.navigate().to("http://www.google.com");
    
            // Find the text input element by its name
            WebElement element = driver.findElement(By.name("q"));
    
            // Enter something to search for
            element.sendKeys("Cheese!");
    
            // Now submit the form. WebDriver will find the form for us from the element
            element.submit();
    
            // Check the title of the page
            System.out.println("Page title is: " + driver.getTitle());
    
            // Google's search is rendered dynamically with JavaScript.
            // Wait for the page to load, timeout after 10 seconds
            (new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
                public Boolean apply(WebDriver d) {
                    return d.getTitle().toLowerCase().startsWith("cheese!");
                }
            });
    
            // Should see: "cheese! - Google Search"
            System.out.println("Page title is: " + driver.getTitle());
    
            //Close the browser
            driver.quit();
        }
    }
  8. 在项目目录执行如下命令:
    mvn compile
    mvn exec:java -Dexec.mainClass=”org.openqa.selenium.example.Selenium2Example”

    运行后就能看到一个firefox窗口被创建出来,自动访问google并搜索, 在console窗口中会看到title的输出

 

 

查找读写指定文件的进程

今天遇到一个问题,需要知道读写某个特定文件的进程是哪个。开始找到inotify,发现它确实能监控文件的读写等一系列事件,但它只能告知制造这些事件的用户id,而没有进程id。这时候想到lsof, 它能列出当前所有被打开的文件及打开进程的信息。那么在收到inotify事件通知后,执行lsof不就能知道进程信息了,抱着这个想法写了个python脚本,结果发现屁用没有。因为大多数修改文件的过程,都是修改完后立刻关闭文件的,收到inotify事件通知再去执行lsof几乎得不到任何有用信息。

正在陷入困境之际,网上找到了答案。只要执行如下命令:

/sbin/auditctl -w 文件路径 -p war

等到文件改变后,执行:
/sbin/ausearch -f 文件路径

就能知道到底是哪个进程修改了这个文件。ausearch的输出信息很多,可以用more或倒到一个文件里慢慢看。
看完后执行
/sbin/auditctl -D

以删除所有监控规则。

在CENTOS 6.4 测试通过。

 

14年前做的一个NURBS Demo

最近整理文件,发现14年前的NURBS Demo居然在Win 7下还能很好运行,速度比当年快了很多。

当时研究在3D游戏中,采用NURBS建模的模型。根据相机与物体的位置,实时演算生成模型的三角形。 离相机远的部分,三角形就少,节省渲染时间,离相机近的就三角形多,细节更丰富些。说起来很理想,但实现起来有好几个难点:

  1. NURBS Trim的问题
    NURBS曲面中挖洞的方法是用NURBS曲线去描述这个洞,如何快速在游戏中实现是个难点。这是我当时主要攻关的问题。当时找出两个方法,一个是根据相机距离远近,及曲线不同段的曲率,不断调整切分Nurbs Trim曲线的不同段的粒度。一个是另辟蹊径,给3DS MAX开发了一个插件,能在编辑NURBS曲面时,同时生成一个合并了原有材质且带Alpha通道的高精度材质图片, 在Nurbs Trim 曲线以内的alpha通道都是透明的。
  2. NURBS编辑工具的问题
    当时公司用的NURBS编辑工具主要是3DS MAX,虽然是有较强的NURBS曲面编辑功能,但实际生成的NURBS曲面问题很多,远不如同期的Rhino,可Rhino当时对插件之类的二次开发支持又很不好。
  3. NURBS曲面在随着相机距离而调整模型的过程中,物体的边缘,会在屏幕上产生抖动感。
    这个问题相当难以克服,一直没能解决。

当时有宣传用NURBS的游戏,例如Quake3,其实它只是在建模中使用了NURBS,并没有做到实时的生成模型。当时整个游戏界对NURBS抱有很高的期望,有显卡公司想从硬件层面给予解决,但后来都没了消息,再后来也就没再关注这方面的进展,不知现在怎样。不过现在的显卡能力已经超强,不用NURBS技术,就靠堆三角形已经能实现近乎真实的画面效果了。

下面是Demo的两个截图,大家可以看到这个鸭子的三角形数量在两个图里是不同的。在同一个图中,鸭子不同部位切分的细节程度也是不同的, 整个鸭子上的三角形都是每帧都重新实时生成的。

当时为了搞这个,读了很多SIGRAPH,MSR,及各大学关于NURBS的论文,对自己提高帮助很大。

11-2

 

这个demo的下载链接是 http://www.nihuo.com/downloads/nv.zip。

下载下来demo后解压,选择File ->Open, 打开NRB_DUCK.oo就能看到鸭子, 按下F键就能看到三角形的线框,按鼠标右键能旋转模型, 按<, >能调整模型切分的系数。更详细的可参看readme。屏幕左上角的tri是整个模型的三角形数量。因为主要是为了演示NURBS一些关键算法的效果,其他方面都很粗糙,还请见谅。

Nginx模块开发教程

做Nginx模块开发的时候,发现这方面的文档很少, 磕磕绊绊走了不少弯路。 过了两年,发现有点改善,但不算大。 昨天有人问能不能教他简单的Nginx开发入门,本想在网上给他找个教程的,结果没找到太合适的,于是干脆自己写了个简单的教程。主要是入门代码和一些资料的索引。有两个例子, 一个是Hello World, 就是访问URL显示Hellow World, 一个是Hello World Text, 就是可以通过配置文件来定义显示的欢迎信息。 教程地址是 https://github.com/nihuo/Nginx-Module-Development-Tutorial。 看完这个教程应该就会知道如何开始写Nginx模块,如何解析参数,如何输出。

这个教程是给Nginx模块开发的初学者的。其实我自己也是个初学者,之前正式开发过的模块只有两个,是抱着和大家一起学习的态度写这个教程的。 尝试分享给别人其实也是自己整理旧知识学习新知识的很好过程, 发现了不少自己以前认识错误的地方,狂汗。 当然,现在写的例子,估计问题还是不少,算是抛砖引玉,欢迎大家多多批评指教。

以后有空的时候还会再添加例子,也欢迎大家来编辑添加。 Nginx不只是个Web Server,其实是个很好的高性能服务器二次开发平台, 希望能通过这个教程让更多人认识Nginx巨大的二次开发潜力。

整个教程是用英文写得,为了锻炼自己的英文,可能会让英语大牛们贻笑大方,笑过后,不妨耐心指正,将不胜感激。

 

IE10的奇怪问题

今晚遇到个IE10的问题,折腾了很长时间。就是在Win7下面的IE10中Ajax选择Post模式, 用HTTP Watch看到所有信息都正常,但在服务器端就是拿不到POST的数据。设置IE10为IE9模式就没有这个问题。折腾了好久,后来发现关闭HTTP WATCH就没有这个问题了,真是吐血。

《致老去的我》

这几天循环一首歌,邵夷贝的《致老去的我》,在http://www.songtaste.com/song/3256656/能听到。

 

《致老去的我》

亲爱的老去的我
此刻你坐在窗前
向过去回望
做过哪些选择
获得怎样的生活
他可否如你想象

是否生活在这样的国
即使不靠近海岸和山河
也四处可见绽放的花朵
人们扯下万千口罩
放肆笑着

过最接近生活的生活
安全的饭菜和牢固的屋舍
不警惕危险 不担心病患
没有人被允许经历孤单

孩子们看得到 彩虹和蜻蜓
老师教他自由 车辆为他缓行
夜晚宁静安眠 白天喜悦清醒
家永远在原地 他从不迁移

陌生的人儿啊
全部都充满善意
分享而不夸耀
不关心背景
不关心什么身份
相遇仿佛遇见太阳

在任何情况下 从不慌张
不热衷比较 内心很坦荡
爱好多样 有坚定的信仰
人们撕下万千面具
尽情歌唱

过最接近生活的生活
安全的饭菜和牢固的屋舍
不警惕危险 不担心病患
没有人被允许经历孤单

梦想是天生的 必有得愿望
是身份的证明 不会被谁影响
就像每一个人 都终会死去一样
每个人也终究会实现梦想

做过哪些选择 获得怎样的生活
它是否如你想象
做过哪些选择 获得怎样的生活
它是否如你想象

词曲:邵夷贝

 

 

智能电视乱想

小米电视这样的智能电视应该再加一个primesense.com 提供的3D摄像头(primesense也是kinect技术的提供者)及麦克风。 加上后能做很多事,最容易想到的是玩游戏和视频聊天,除此之外还有很多更有意思的:

  1. 控制电视不再用遥控器,而是用手势或语音
  2. 自动识别看电视的人,为每个人保存单独的收看进度,及收藏夹列表,及观看记录。并可根据不同的人给出不同的收视推荐
    当有多个人一起看电视时,可以用如下解决方案

    1. 每个人可以通过特定手势或语音来请求电视的控制权,如果没有人提出异议则电视由他控制
    2. 如果有人提出异议,则电视可以用如下规则来选出谁最终控制电视
      1. 从争议者中选出这个星期看电视较少者
      2. 用石头剪子布之类的小游戏来决定
  3. 深度的收视行为统计分析
    现在的收视率统计是用一些样本户(尼尔森公司在中国有18000个收视率调查样本户, 2007年数据),进行采样。而采样过程中,还需要人员的参与,比如另一大收视率统计公司索芙特的遥控器上有家里每个人的按钮,每次选择了台后需要按下对应按钮,这样机器才知道当前是谁在看电视。这种收视率调查方式问题很多。首先是因为需要人的参与,容易有错误,例如人按错了键,或者懒得按。再者采样范围过小,容易被一些
    电视台控制而用3D摄像头+麦克风很容易对用户的收视行为进行深入准确的分析

    1. 用摄像头识别有多少人看,收看人的性别,年龄段
    2. 收看时谁是专心在看,谁是边聊天嗑瓜子,甚至看着报纸,或走来走去
    3. 统计播放到电视剧的什么时候,大家更专注,什么时候笑得最多
  4. 广告统计分析
    1. 可以统计哪些广告大家真正认真看了,哪些没认真看,哪些压根没看
    2. 精确统计广告观看者的人口属性:年龄段,性别,影视喜好
  5. 真正的精准定向广告
    互联网电视知道每个用户最近看了什么电视,通过电视浏览了什么网页,搜索了什么关键词,这些资料都有助于提高广告的定向效果。
  6. 高度互动的,游戏式的广告
    例如播放一款汽车广告时,用户可以进到广告里,看到自己坐在车上的样子,玩一个开这个车赛车的游戏(可参照用kinect玩赛车游戏的效果,不需要任何游戏柄,直接双手做出握方向盘的姿势即可)。
  7. 有时看着电视就睡着了,通过摄像头识别出来后,电视可自动关闭
  8. 通过摄像头识别出小孩,对他看电视时间进行限制
  9. 试衣服
    通过3D摄像机估测出人的身高,腰围,胸围等指标,然后吧人脸等图片上传上去,在衣服的购物网站,立刻就能显示出购买人穿上新衣服以后的效果。