专栏首页python3python变相调用htmlunit

python变相调用htmlunit

目前团队使用的自动化测试框架是robotframework+webdriver(IE)+python,据说是从趋势那边搬过来的。webdriver里面,IEdriver是运行最慢的,因此每次跑一遍用例都要花上4个小时

,这个如果在工作日跑的话,半天工作时间就没了,如果在下班后跑,发现问题又不能及时调试,很烦……

Java里的webdriver有个好东西是htmlunit,这个在python版的webdriver里却没有,应该跟htmlunit纯用java写的有关。htmlunit跑用例可以不打开浏览器在后台跑,因此在webdriver里面是最快的。python里面虽然没有htmlnuit,但是有个第三方库是Jpype,可以通过模拟java虚拟机直接调用jar包!因此我的想法是用java写个接口把htmlunit常用方法再封装下,然后用python通过jpype来调用接口。

package htunit;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import com.thoughtworks.selenium.DefaultSelenium;
public class htunit {
    WebDriver driver;  
    public htunit(){
        DesiredCapabilities htmlunitcapabilities=DesiredCapabilities.htmlUnit();
        htmlunitcapabilities.setJavascriptEnabled(true);
        htmlunitcapabilities.setCapability(HtmlUnitDriver.INVALIDSELECTIONERROR, false);
        htmlunitcapabilities.setCapability(HtmlUnitDriver.INVALIDXPATHERROR, false);
        //driver=new InternetExplorerDriver();
        driver=new HtmlUnitDriver(htmlunitcapabilities);
        driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
        driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        //driver.setJavascriptEnabled(true);
    }
    public void deletecookie() throws Exception{
        driver.manage().deleteAllCookies();
    }
    public String getpage(){
        return driver.getPageSource();
    }
    public String gettitle(){
        return driver.getTitle();
    }
    public void get(String url){
        driver.get(url);
    }
    public void SetInputTextById(String Id,String value) throws Exception{
        driver.findElement(By.id(Id)).clear();
        driver.findElement(By.id(Id)).sendKeys(value);
    }
    public void SetInputTextByName(String name,String value) throws Exception{
        driver.findElement(By.name(name)).clear();
        driver.findElement(By.name(name)).sendKeys(value);
    }
    public void SetInputTextByXpathWithoutClear(String xpath,String value) throws Exception{
        driver.findElement(By.xpath(xpath)).sendKeys(value);
    }
    public void SetInputTextByXpath(String xpath,String value) throws Exception{
        driver.findElement(By.xpath(xpath)).clear();
        driver.findElement(By.xpath(xpath)).sendKeys(value);
    }
    public void ClickButtonByXpath(String CSS) throws Exception{
            driver.findElement(By.xpath(CSS)).click();
        //sleep short time in python
    }
    public void ClickById(String Id) throws Exception{
        driver.findElement(By.id(Id)).click();
    }
    public void ClickByName(String name) throws Exception{
        driver.findElement(By.name(name)).click();
    }
    public void ClickByXpath(String xpath) throws Exception{
        driver.findElement(By.xpath(xpath)).click();
    }
    public void DoubleClickByXpath(String xpath) throws Exception{
        driver.findElement(By.xpath(xpath)).click();
    }
    public void SelectFrame(String frame) throws Exception{
        driver.switchTo().frame(frame);
        //driver.switchTo().window(frame);
        //return frame;
    }
    public void ClickMsgBox() throws Exception{
        driver.switchTo().activeElement().sendKeys(Keys.RETURN);
    }
    //problem
    public void SelectComboxById(String Id,int dts) throws Exception{
        ClickById(Id);
        WebElement a=driver.switchTo().activeElement();
        while (dts!=0){
            a.sendKeys(Keys.DOWN);
            dts--;
        }
        a.sendKeys(Keys.RETURN);
    }
    public void SwitchToActiveFrame() throws Exception{
        driver.switchTo().defaultContent();
    }
    public void SelectComboxByXpath(String xpath,int dts) throws Exception{
        ClickByXpath(xpath);
        WebElement a=driver.switchTo().activeElement();
        while (dts!=0){
            a.sendKeys(Keys.DOWN);
            dts--;
        }
        a.sendKeys(Keys.RETURN);
    }
    public void UIIsElementPresent(String locator) throws Exception{
        int a=103;
    }
    public void UIVerifyTextByXpath(String xpath,String val) throws Exception{
                                                                                                                                                                                                                                                                           
    }
    public String UIGetTextByXpath(String xpath) throws Exception{
        return driver.findElement(By.xpath(xpath)).getText();
    }
    public boolean UIVerifyTextByJsId(String Id,String val) throws Exception{
        JavascriptExecutor js=(JavascriptExecutor)driver;
        String tx=js.executeScript("return document.getElementById('"+ Id+ "').value").toString();
        //question
        boolean re=tx.contains(val);
        return re;
    }
    public boolean UIVerifyValueByJsIdIsPositive(String Id) throws Exception{
        JavascriptExecutor js=(JavascriptExecutor)driver;
        String tx=js.executeScript("return document.getElementById('"+ Id+ "').value").toString();
        if (Integer.parseInt(tx)>0)
            return true;
        else
            return false;
    }
    public void SelectDateByName(String name, String sdate) throws Exception{
                                                                                                                                                                                                                                                                           
    }
    public void SelectDateById(String Id, String sdate) throws Exception{
                                                                                                                                                                                                                                                                           
    }
    public void SelectDate(String element,String sdate) throws Exception{
                                                                                                                                                                                                                                                                           
    }
    public void AddContactInfo(String Id,String phone,String address) throws Exception{
        ClickById(Id);
        driver.switchTo().activeElement();
        ClickById("btnAdd.ContactInfoWin");
        SetInputTextById("phoneNo.ContactInfoModifyWin", phone);
        SetInputTextById("custAddr.ContactInfoModifyWin", address);
        ClickById("btnSave.ContactInfoModifyWin");
        ClickById("btnSave.ContactInfoWin");
        ClickMsgBox();
    }
    public void AddEventInfo(String Xpath,String btnId, String Id1,int Id2,int Id3,String name1,String name2) throws Exception{
        ClickByXpath(Xpath);
        ClickById(btnId);
        SetInputTextById("eventTitle.EventDetail", Id1);
        SelectComboxById("alertType.EventDetail", Id2);
        SelectDateByName("alertStrDate", name1);
        SetInputTextByName("alertStrTime", name2);
        driver.switchTo().activeElement().sendKeys(Keys.RETURN);
        SelectComboxById("fowardTime.EventDetail", Id3);
        ClickById("save.EventDetail");
        ClickMsgBox();
    }
    public int switch_to_active_element(int cmd) throws Exception{
        if(cmd==1){
        driver.switchTo().activeElement().sendKeys(Keys.DOWN);
        return 1;}
        else if(cmd==2){
        driver.switchTo().activeElement().sendKeys(Keys.RIGHT);
        //driver.switchTo().activeElement().sendKeys(Keys.RETURN);
                                                                                                                                                                                                                                                                           
        return 2;}
        else if(cmd==3){
        driver.switchTo().activeElement().sendKeys(Keys.RETURN);
        return 3;}
        return 4;
    }
    public void switch_to_default_content() throws Exception{
        driver.switchTo().defaultContent();
        //driver.switchTo().
    }
    public void waitfor(String xpath) throws Exception{
                                                                                                                                                                                                                                                                           
    }
    public String getsource() throws Exception{
        return driver.getPageSource();
    }
}

由于后来其他原因失败了,导致这边只封装了最基本的接口。这里拿网易邮箱来做测试,python代码:

#coding=utf8
import jpype
import time
import os.path
start=time.time()
jarpath=os.path.join(os.path.abspath('.'),'E:/lib')
print jarpath
jvmPath=jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath,"-Djava.ext.dirs=%s"%jarpath)
jpype.java.lang.System.out.println("hello world!")
javaclass=jpype.JClass("htunit.htunit")
temp=javaclass()
temp.deletecookie()
url='http://mail.163.com'
username='****'
pwd='****'
id='loginBtn'
temp.get(url)
temp.SetInputTextById("idInput", username)
temp.SetInputTextById("pwdInput", pwd)
temp.ClickById(id)
print time.time()-start

上面java代码中如果24行不注释,注释25行则会调用IE接口。下面是在我机器上跑的时间对比:

结果是htmlunit壮烈牺牲了,java报了一个跟证书有关的错,这个应该跟网易邮箱有安全认证有关……因此只能在按提交前把时间打印出来了下,大概是IEdriver的三分之一,如果有应用的地方,确实很快啊!

我是把java所有htmlunit的jar包都拖到E:\lib下面,并且把导出的jar包也放到E:\lib下面,要不然jpype会找不到的。另外这种情况下使用htmlunit的时候浏览器不要设代理,否则也会报错,当然htmlunit本身是可以设代理的,我没研究

最后之所以不在项目中应用主要是因为团队项目对js依赖很大,而这个是htmlunit最大的软肋………

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JAVA多线程并发之线程实现,4种线程池,终止线程4种方式

    Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方 法就是通过 Thread 类的 start()实例方法。...

    三哥
  • 第49次文章:Filter&Listener

    每周一约!哈哈!小白又来啦!这周我们来聊聊Javaweb的三大组件——servlet、filter、listener。servlet之前的文章已经讲过了,这次来...

    鹏-程-万-里
  • HashMap 容量为什么总是为 2 的次幂?

    HashMap是根据key的hash值决策key放入到哪个桶(bucket)中,通过 tab=[(n - 1) & hash] 公式计算得出,其中tab是一个哈...

    Java技术栈
  • 不能用 + 拼接字符串? 这次我要吊打面试官!

    好久没维护《吊打面试官》系列了,今天再来一篇,这次真的要吊打了,哈哈!(看往期吊打系列请在后台回复:吊打,我会陆续更新……)

    Java技术栈
  • 软件安全性测试(连载4)

    XSS测试就是在容易出现XSS注入的地方输入被测代码,提交后观察其显示是否会触发JavaScript脚本。常用的XSS测试JavaScript脚本主要就下面两个...

    小老鼠
  • Spark2.x新特性的介绍

    dataframe与dataset统一,dataframe只是dataset[Row]的类型别名

    我脱下短袖
  • 软件安全性测试(连载6)

    跨站请求伪造(Cross-Site Request Forgery:CSRF),也被称为 One-Click Attack 或者 Session Riding,...

    小老鼠
  • JVM性能

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真...

    小老鼠
  • Java工程师学习指南第6部分:深入理解JVM虚拟机

    本文整理了微信公众号【Java技术江湖】发表和转载过的JVM虚拟机相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧。

    Java技术江湖
  • Java工程师学习指南第7部分:重新学习MySQL与Redis

    本文整理了微信公众号【Java技术江湖】发表和转载过的Mysql和Redis相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧。

    Java技术江湖

扫码关注云+社区

领取腾讯云代金券