【问题标题】:Click elements by classes with specific text in CasperJS在 CasperJS 中按具有特定文本的类单击元素
【发布时间】:2016-03-15 16:46:44
【问题描述】:

我现在正在尝试 2 个小时来找到一个选择器,以便在 facebook 共享对话框中选择一个列表: facebook share dialog

(我不使用他们的 api 来限制对某些功能的访问)

var casper = require('casper').create({

    pageSettings: {
        loadImages:  false,        // The WebPage instance used by Casper will
        loadPlugins: false,        // use these settings
        userAgent: 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0'
    },
    logLevel: "info",              // Only "info" level messages will be logged
    verbose: true


});
var fs = require('fs');
var dyn = null;
casper.start('http://facebook.com/login.php', function() {
    // search for 'casperjs' from google form
   console.log("page loaded");

   this.test.assertExists('form#login_form', 'form is found');

   this.fill('form#login_form', { 
        email: 'email', 
        pass:  'pass'
    }, true);

    this.wait(1000, function() {
        casper.capture('login.png');
        console.log("screen captured");
    });
});
    casper.thenOpen('https://www.facebook.com/dialog/share?app_id=966242223397117&redirect_uri=http://www.facebook.com/dialog/return/close&display=popup&href=http://www.isearchforjob.com/', function() {

    console.log("debug loaded");

    this.wait(1000, function() {
        casper.capture('debug.png');
        console.log("screen captured");
    });

    if (this.exists('span._55pe')) {
        this.echo('span._55pe exists');
        this.click('span._55pe');
        this.echo('\n\nspan._55pe clicked\n\n');
    }   

    this.wait(5000, function() {
    if (this.exists('li[class="_54ni _42ym _2n3i __MenuItem"] > a._54nc')) {
        this.echo('li[class="_54ni _42ym _2n3i __MenuItem"] > a._54nc exists');

        this.echo('\n\n li[class="_54ni _42ym _2n3i __MenuItem"] > a._54nc clicked\n\n');
    }   

    });


    this.wait(10000, function() {

        fs.write('2.htm', this.getPageContent(), 'w');

        casper.capture('clicked2.png');
        console.log("screen captured");
    });
});
casper.run();

第一次点击效果很好这里是截图:

screenshot

但第二次点击不会:

this.click('li._54ni _42ym _2n3i __MenuItem');

所有列表都使用相同的选择器,所以没用

这是 HTML:

<li class="_54ni _42ym _2n3i __MenuItem" role="presentation">
    <a class="_54nc" href="#" role="menuitem">
        <span data-reactroot=""><span class="_54nh"><span>Share in a group</span>

是否有机会通过文本获取选择器? “在群组中分享”

在这种情况下是否可以模拟向下箭头键?

【问题讨论】:

  • “在这种情况下是否可以模拟向下箭头键?” - 这到底是什么意思?

标签: javascript css-selectors phantomjs


【解决方案1】:

所有的类都用类选择器写在一个之后:

this.click('li._54ni._42ym._2n3i.__MenuItem');

您还可以使用an attribute selector 来匹配具有特定属性字符串的元素(适用于任何属性,而不仅仅是class):

this.click('li[class="_54ni _42ym _2n3i __MenuItem"]');

你甚至可以混合这些:

this.click('li.__MenuItem[class^="_54ni _42ym"]');

最后,您可能想要单击列表项中的链接:

this.click('li[class="_54ni _42ym _2n3i __MenuItem"] > a._54nc');

【讨论】:

  • Artjom B. 非常感谢您的努力,不幸的是,我选择了正确的选择器,但我无法单击它,我编辑了我的问题,以便您查看完整视图。
  • 那么你必须找到一种不同的方法来消除不同的列表项的歧义。这是我能用你提供的有限标记示例做的最好的事情。
  • 我编辑了我的问题,这是整个页面的链接:facebook.com/dialog/…
  • 如果答案对您没有帮助或解决您的问题,您不一定需要接受。如果您自己找到了答案,那么您可以在此处发布您自己的答案,但请记住答案应该是完整的。
  • 我设法找到了一个解决方案,因为你是答案,你给了我正确的路径,我使用 xpath 来完成它this.click(x('//span[text()="Share in a group"]'))你可以将它添加到你的答案中:),但我被这个stackoverflow.com/questions/36045035/… 卡住了 2 天@ 我尝试了一切:/,发现你是这个无头浏览器的专家,任何帮助将不胜感激,谢谢。
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 2015-11-19
  • 2015-06-17
  • 2014-02-27
  • 1970-01-01
相关资源
最近更新 更多