当前位置:  开发笔记 > 编程语言 > 正文

如何遍历webdriverjs元素,直到元素具有文本值

如何解决《如何遍历webdriverjs元素,直到元素具有文本值》经验,为你挑选了1个好方法。

我试图弄清楚WebDriverJs中的循环如何与promises一起工作.

假设你有以下html:

  
Rock Paper Scissors

使用WebDriverJs我想找到带有文本'Scissors'的跨度并单击它.

最简单的方法是确保源html具有适当的标识符,但是说无法更改,给定上面的html,WebDriverJs代码会是什么样子.

我尝试过以下方法:

function clickElementWithText(driver, textValue) {
    driver.findElements(webdriver.By.css('#textelements span')).then(function(spans) {
        for (var i = 0; i < spans.length; i++) {
            var matched = spans[i].getText().then(function(text) {
                console.log('Text value is: ' + text);
                return text === textValue;
            });
            console.log(matched);
            if (matched === true) {
                console.log('clicking!');
                spans[i].click();
                return;
            }
        }
    });
}

var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).build();
driver.get('http://webdriverjsdemo.github.io/');
clickElementWithText(driver, 'Scissors');

问题是匹配true在评估时不相等,即使它应该被设置为true.

有什么想法发生了什么?



1> alecxe..:

我们如何通过使用一些函数式编程来简化它,filter()函数:

var spans = driver.findElements(webdriver.By.css('#textelements span'));
webdriver.promise.filter(spans, function(span) {
    return span.getText().then(function(text) {
        console.log('Text value is: ' + text);
        return text === textValue;
    });
}).then(function (filteredSpans) {
    filteredSpans[0].click();
});

或者,一个"不太酷"的解决方案,但更直接的方法是使用By.xpath:

var span = driver.findElement(webdriver.By.xpath('//*[@id = "textelements"]//span[. = "' + textValue + '"]'));
span.click();

或者,我们也可以使用以下方法检查onclick属性值By.css:

var span = driver.findElement(webdriver.By.css('#textelements span[onclick*="' + textValue + '"]'));
span.click();

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有