CasperJS-在网站上注册并验证Gmail上发送的邮件 - 包括slimer和phantom-

时间:2014-03-12 14:24:14

标签: javascript gmail phantomjs casperjs slimerjs

编辑:这是Windows的行为,使用linux它就失败了。

首先,如果您成功使用casper导航gmail(没有随机等待时间 - 从20秒到5分钟),请告诉我。

我想在我们的网站上注册,然后使用Gmail自动验证我的注册(整个注册步骤)。有人之前做过吗?

我没有注册的问题,我可以登录我的邮箱(Gmail),但在我遇到麻烦导航并验证我在Gmail中的注册后,我观察到phantomJS和slimerJS之间的不同行为。

在幻像中它将起作用(没有特殊命令),但可能需要在下一步(waitForSelector)传递之前5分钟。而对于slimerjs,它只会停留在邮箱页面上。

编辑:一件奇怪的事情:如果我在打开弹出窗口的链接上手动点击(slimer),它会停止被阻止并且我的导航继续,就好像它无法检测到步骤本身的结束在没有其他交互的情况下提交点击后无法执行waitFor。这是刷新/重装问题吗?

试着看看自己:

casper.thenOpen('https://accounts.google.com/ServiceLogin?service=mail&continue=https://mail.google.com/mail/&hl=en', function(){
    this.sendKeys("input#Email","your mail");
    this.sendKeys("input#Passwd","your password");
    this.click("input#signIn.rc-button-submit");
    console.log(this.getCurrentUrl());
    this.waitForSelector(".aeF",function(){//fail with linux -> timeout
        this.test.pass("ok"); //windows -> stuck in slimer, several times in phantom
        this.test.assertExists(".T-I.J-J5-Ji.T-I-KE.L3","Gmail Home ok");
        console.log("url "+this.getCurrentUrl());
    });

我没有得到任何timeOut错误。在slimerjs中它只是打开页面。

如果我执行waitForPopup而不是waitForUrl,我有错误(超时 - >没有弹出),那么为什么waitForUrl / waitForSelector ...会卡住?我试过--web-security = no, - ignore-ssl-errors = true命令(没有链接但是我试过--output-encoding = ISO 8859-1也没用)。

这里有幻影和slimer(doc)之间的区别: http://docs.slimerjs.org/0.8/differences-with-phantomjs.html (我认为这个问题没用)

1 个答案:

答案 0 :(得分:2)

好吧,我们终于找到了一种方法:默认情况下,问题是ajax请求上的gmail循环,检查一些新邮件等等......请参阅Page polls remote url,导致casper在步骤中阻塞。 / p>

幸运的是谷歌提出了一种避免这种情况的方法,使用简化的HTML版本(例如,您可以使用此版本为您的测试使用特殊的Gmail地址): casperJs+gmail

这样脚本可以正常工作。

奖金:

/*
 * Click on an element specified by its selector and a part of its text content.
 * This method resolves some problem as random space in textNode / more flexible too.
 * Need to fix one bug though : when there is a tag in textContent of our selector.
 */
casper.clickSelectorHasText = function (selector, containsText){
    var tmp = this.getElementsInfo(selector)
        ,i
        ,l
        ,bool=false
        ;
    for (i=0,l=tmp.length;i<l; i++){
        if(tmp[i].text && tmp[i].text.indexOf(containsText)!==-1){
            this.clickLabel(tmp[i].text);
            bool=true;
            break;
        }
    }
    casper.test.assert(bool, "clickSelectorHasText done, text and selector found -> click selector " + selector +" which contains text " + containsText);
};

casper.thenOpen('https://accounts.google.com/ServiceLogin?service=mail&continue=https://mail.google.com/mail/&hl=en', function scrapeCode(){
        //log in
        this.sendKeys("input#Email","your email");
        this.sendKeys("input#Passwd","your password");
        this.click("input#signIn.rc-button-submit");
        //wait to redirect to our mailbox
        this.waitForSelector("form[name='f']",function(){
            //check main block
            this.test.assertExists("form[name='f']","Gmail Home ok");
            this.test.assertSelectorHasText("span", "Your gmail title message");
            this.clickSelectorHasText("font", "one string which appears in font tag");
            //wait inscription message appears
            this.waitForSelector("div.msg",function(){
                this.test.assertSelectorHasText("a","the message which activates your account--> in <a>");
            });
        })
        //validate our account
        .then(function(){
            this.clickLabel("the message which activates your account--> in <a>");
            this.waitForPopup(/mail/, function(){
                this.test.pass("popup opened");
            });
            this.withPopup(/mail/, function(){
                this.viewport(1400,800);
                this.test.pass("With Popup");
                //wait something on your website (for me selector .boxValid)
                this.waitForSelector(".boxValid", function(){
                    /*
                     * Here your code after validation
                     */
                });

            });
        })

可以使用普通的gmail使用事件来执行此操作,请参阅 resource.received