我试图弄清楚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.
有什么想法发生了什么?
我们如何通过使用一些函数式编程来简化它,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();