单击页面上具有给定类别的所有锚标签,但在导航之前取消

布莱克西

尝试自动化一些分析跟踪代码的测试,当尝试传递links给该each()方法时遇到了问题

我从stackoverflow复制了很多内容-如何跟随casperjs中的所有链接,但是我不需要返回href链接的;我需要返回链接本身(以便可以单击它)。我一直得到这个error: each() only works with arrays.我不返回数组吗?

更新:

对于每个具有.myClass的锚标记,单击它,然后从casper.options.onResourceReceived事件类别,事件动作等返回请求的参数。我可能必须取消导航,而不必取消单击后发生的导航。我只需要查看请求,而无需加载以下页面。

测试步骤:

  1. 点击链接 .myClass
  2. 查看请求参数
  3. 取消单击以防止其转到下一页。

我是javascript和casper.js的新手,所以如果我误解我深表歉意。

另一个更新:我已经更新了代码,而不是返回一个类数组。不过,其中有一些粗略的代码(请参见内联注释)。

但是,我现在在单击后取消导航时遇到问题。.Clear()取消了所有js。是否要防止单击后发生默认操作?喜欢e.preventDefault();吗?

var casper = require('casper').create({
    verbose: true,
    logLevel: 'debug'
});

casper.options.onResourceReceived = function(arg1, response) {

    if (response.url.indexOf('t=event') > -1) {
        var query = decodeURI(response.url);
        var data = query.split('&');
        var result = {};
        for (var i = 0; i < data.length; i++) {
            var item = data[i].split('=');
            result[item[0]] = item[1];
        }
        console.log('EVENT CATEGORY = ' + result.ec + '\n' +
            'EVENT ACTION = ' + result.ea + '\n' +
            'EVENT LABEL = ' + decodeURIComponent(result.el) + '\n' +
            'REQUEST STATUS = ' + response.status
        );

    }
};

var links;
//var myClass = '.myClass';

casper.start('http://www.leupold.com', function getLinks() {
    links = this.evaluate(function() {

        var links = document.querySelectorAll('.myClass');
        // having issues when I attempted to pass in myClass var.

        links = Array.prototype.map.call(links, function(link) {

            // seems like a sketchy way to get a class. what happens if there are multiple classes?
            return link.getAttribute('class');
        });

        return links;
    });
});

casper.waitForSelector('.myClass', function() {

    this.echo('selector is here');
    //this.echo(this.getCurrentUrl());
    //this.echo(JSON.stringify(links));

    this.each(links, function(self, link) {
        self.echo('this is a class : ' + link);
        // again this is horrible
        self.click('.' + link);
    });
});



casper.run(function() {
    this.exit();
});
Artjom B.

您要处理两个问题。

1.根据类别选择元素

通常,一个类被多次使用。因此,当您首先基于此类选择元素时,将获得具有该类的元素,但不能保证这将是唯一的。例如,查看您可以通过以下方式选择的元素选择.myClass

  1. myClass
  2. myClass myClass2
  3. myClass myClass3
  4. myClass
  5. myClass myClass3

当您以后遍历这些类名时,您会遇到问题,因为无法使用来单击4和5 casper.click("." + links[i].replace(" ", "."))(您还需要用点替换空格)。casper.click仅单击特定选择器的第一个匹配项。这就是为什么我用createXPathFromElement取自斯泰恩德ryck找到页面上下文中的每一个元素的独特的XPath表达式。

然后,您可以像这样通过唯一的XPath单击正确的元素

casper.click(x(xpathFromPageContext[i]));

2.取消导航

这可能取决于您的页面实际是什么。

注意:我使用的casper.test属性是Tester模块您可以像这样通过调用casper来访问它casperjs test script.js

注意:还有casper.waitForResource功能。看看它。

2.1 Web 1.0

单击表示将加载新页面时,可以向事件添加事件处理程序page.resource.requested然后abort()request无需将页面重新设置为即可startURL

var resourceAborted = false;
casper.on('page.resource.requested', function(requestData, request){
    if (requestData.url.match(/someURLMatching/)) {
        // you can also check requestData.headers which is an array of objects:
        // [{name: "header name", value: "some value"}]
        casper.test.pass("resource passed");
    } else {
        casper.test.fail("resource failed");
    }
    if (requestData.url != startURL) {
        request.abort();
    }
    resourceAborted = true;
});

在测试流程中:

casper.each(links, function(self, link){
    self.thenClick(x(link));
    self.waitFor(function check(){
        return resourceAborted;
    });
    self.then(function(){
        resourceAborted = false; // reset state
    });
});

2.2单页申请

可能附加了太多事件处理程序,很难完全阻止它们。一个更简单的方法(至少对我而言)是

  1. 得到所有唯一的元素路径,
  2. 遍历列表并每次执行以下操作:
    1. 再次打开原始页面(基本上是对每个链接进行重置)
    2. 单击当前的XPath

这基本上就是我在这个答案中所做的

由于单页应用程序不会加载页面。navigation.requestedpage.resource.requested不会被触发。resource.requested如果要检查一些API调用,则需要该事件:

var clickPassed = -1;
casper.on('resource.requested', function(requestData, request){
    if (requestData.url.match(/someURLMatching/)) {
        // you can also check requestData.headers which is an array of objects:
        // [{name: "header name", value: "some value"}]
        clickPassed = true;
    } else {
        clickPassed = false;
    }
});

在测试流程中:

casper.each(links, function(self, link){
    self.thenOpen(startURL);
    self.thenClick(x(link));
    self.waitFor(function check(){
        return clickPassed !== -1;
    }, function then(){
        casper.test.assert(clickPassed);
        clickPassed = -1;
    }, function onTimeout(){
        casper.test.fail("Resource timeout");
    });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单击页面上具有给定类别的所有锚标签,但在导航之前取消

来自分类Dev

当存在多个具有相同类别的标签时,计算锚标签的点击次数

来自分类Dev

单击具有按钮角色的锚标签

来自分类Dev

在Wordpress的单个页面上显示某个类别的所有帖子

来自分类Dev

(1.9)获取所有产品类别的ID(在产品页面上)

来自分类Dev

选择页面上具有特定类别的最后一个元素

来自分类Dev

选择页面上具有特定类别的最后一个元素

来自分类Dev

从维基百科获取给定类别的所有页面

来自分类Dev

选择具有特定类别的div中的所有标签

来自分类Dev

将具有相同类别的所有标签打乱

来自分类Dev

网站所有页面上的导航相同

来自分类Dev

在单个页面上列出所有类别以及在WordPress中的jQuery滑块内属于该类别的所有页面

来自分类Dev

给定类别的值的所有可能组合的数据框

来自分类Dev

单击按钮如何触发所有锚标签?

来自分类Dev

Laravel获取所有具有类别的记录

来自分类Dev

在新标签页中打开给定页面上的所有超链接

来自分类Dev

具有多个类别的BeautifulSoup findAll标签

来自分类Dev

如何删除特定类别的所有页面

来自分类Dev

对给定顶级类别的所有子类别禁用特定的WooCommerce付款方式

来自分类Dev

在WordPress的当前类别页面上显示所有子类别和父类别

来自分类Dev

获取基于特定类别的所有标签(包括子类别和帖子中的所有标签)

来自分类Dev

获取基于特定类别的所有标签(包括子类别和帖子中的所有标签)

来自分类Dev

WordPress:如何获取某个类别的所有帖子中使用的所有标签?

来自分类Dev

获取具有类别的多个类别的帖子

来自分类Dev

在所有页面上使用Docusign复制的Signature标签

来自分类Dev

我是否需要在所有子页面上重复所有类别?

来自分类Dev

如何在锚标签内对齐跨度以使用给定的所有宽度?

来自分类Dev

如何根据用户角色隐藏具有给定类别的WooCommerce产品

来自分类Dev

如何在MongoDB中查找具有最大值的给定类别的项目

Related 相关文章

  1. 1

    单击页面上具有给定类别的所有锚标签,但在导航之前取消

  2. 2

    当存在多个具有相同类别的标签时,计算锚标签的点击次数

  3. 3

    单击具有按钮角色的锚标签

  4. 4

    在Wordpress的单个页面上显示某个类别的所有帖子

  5. 5

    (1.9)获取所有产品类别的ID(在产品页面上)

  6. 6

    选择页面上具有特定类别的最后一个元素

  7. 7

    选择页面上具有特定类别的最后一个元素

  8. 8

    从维基百科获取给定类别的所有页面

  9. 9

    选择具有特定类别的div中的所有标签

  10. 10

    将具有相同类别的所有标签打乱

  11. 11

    网站所有页面上的导航相同

  12. 12

    在单个页面上列出所有类别以及在WordPress中的jQuery滑块内属于该类别的所有页面

  13. 13

    给定类别的值的所有可能组合的数据框

  14. 14

    单击按钮如何触发所有锚标签?

  15. 15

    Laravel获取所有具有类别的记录

  16. 16

    在新标签页中打开给定页面上的所有超链接

  17. 17

    具有多个类别的BeautifulSoup findAll标签

  18. 18

    如何删除特定类别的所有页面

  19. 19

    对给定顶级类别的所有子类别禁用特定的WooCommerce付款方式

  20. 20

    在WordPress的当前类别页面上显示所有子类别和父类别

  21. 21

    获取基于特定类别的所有标签(包括子类别和帖子中的所有标签)

  22. 22

    获取基于特定类别的所有标签(包括子类别和帖子中的所有标签)

  23. 23

    WordPress:如何获取某个类别的所有帖子中使用的所有标签?

  24. 24

    获取具有类别的多个类别的帖子

  25. 25

    在所有页面上使用Docusign复制的Signature标签

  26. 26

    我是否需要在所有子页面上重复所有类别?

  27. 27

    如何在锚标签内对齐跨度以使用给定的所有宽度?

  28. 28

    如何根据用户角色隐藏具有给定类别的WooCommerce产品

  29. 29

    如何在MongoDB中查找具有最大值的给定类别的项目

热门标签

归档