Selenium.webdriver 试图找到标签文本值
Selenium.webdriver trying to find a tab text vaue
您好,我正在使用 mocha 和 node js,并且正在尝试让 selenium webdriver 工作。该应用程序是一个 SPA。
我想要做的就是获得一个特定的选项卡,然后单击它。
我已经加载了 html 到测试 OK。
这是一个片段
<div id="Tabs">
<ul>
<li> <span> one </span></li>
<li> <span> two </span></li>
...
<li> <span> six </span></li>
</ul>
</div>
在我的 test.js 我有这个...
describe("MYHtml",function(){
var driver;
var tabs;
driver = new webdriver.Builder()
.forBrowser('firefox')
.build();
driver.get("file:///home/myhtml.html");
test.after(function() {
driver.quit();
});
before(function(done){
driver.findElement(By.id("Tabs")).then(function(e){
e.findElements(By.tagName("li")).then(function(b){
console.log("before got tabs length " + b.length);
tabs=b;
done();
});
});
});
test.it("we have some tabs",function(done){
assert.strictEqual(tabs.length,6);
console.log("we have tabs " + tabs.length);
done();
});
test.it("can find a tab name",function(done){
var span;
for(var i=0;i<tabs.length;i++){
tabs[i].findElements(By.tagName("span"))
.then(function(span){
console.log("Field??" + span.getText());
//return span;
done();
});
}
}); )};
它通过了 "we have some tabs"
但失败了 "can find a tab name"
出现此错误
1 failing
1) MYHtml can find tab name:
TypeError: span.getText is not a function
我正在尝试查找 li - 例如,span text = 2
这样我就可以点击它了。
您已经解决了与 then 的承诺,因此 returns 一系列跨度项目。返回数组后,您应该使用 getText():
tabs[i].findElements(By.tagName("span"))
.then(function(spanArray){
console.log('Found spans length:'+ spanArray.length);
spanArray.forEach(function(nextElement) {
nextElement.getText().then(function(text) {
console.log('Text Found' + text);
// An if then check is required here so only
// one done is called.
if (/*---your condition here ---*/) {
done();
}
});
});
});
编辑 修改上面的代码片段以处理数组然后处理每个元素。
进一步评论
添加关于 XPATH 方法的@sferret 评论。
或者使用 XPATH,它可以最大限度地减少所需的代码量和处理量:
var tab=driver.findElement(By.xpath(".//div[@id='Tabs']/ul/li/span[contains(.,'two')]"));
然而,由于示例中的跨度或 div 移动,xpaths 可能很快成为维护问题,因此应注意。您必须考虑页面中可能发生的变化并采取相应措施。少量不会随时间变化的 JS 代码是否比 xPaths 更重,xPaths 理论上每周都会更改,因为选项卡在页面中的位置。
您好,我正在使用 mocha 和 node js,并且正在尝试让 selenium webdriver 工作。该应用程序是一个 SPA。 我想要做的就是获得一个特定的选项卡,然后单击它。 我已经加载了 html 到测试 OK。 这是一个片段
<div id="Tabs">
<ul>
<li> <span> one </span></li>
<li> <span> two </span></li>
...
<li> <span> six </span></li>
</ul>
</div>
在我的 test.js 我有这个...
describe("MYHtml",function(){
var driver;
var tabs;
driver = new webdriver.Builder()
.forBrowser('firefox')
.build();
driver.get("file:///home/myhtml.html");
test.after(function() {
driver.quit();
});
before(function(done){
driver.findElement(By.id("Tabs")).then(function(e){
e.findElements(By.tagName("li")).then(function(b){
console.log("before got tabs length " + b.length);
tabs=b;
done();
});
});
});
test.it("we have some tabs",function(done){
assert.strictEqual(tabs.length,6);
console.log("we have tabs " + tabs.length);
done();
});
test.it("can find a tab name",function(done){
var span;
for(var i=0;i<tabs.length;i++){
tabs[i].findElements(By.tagName("span"))
.then(function(span){
console.log("Field??" + span.getText());
//return span;
done();
});
}
}); )};
它通过了 "we have some tabs" 但失败了 "can find a tab name" 出现此错误
1 failing
1) MYHtml can find tab name: TypeError: span.getText is not a function
我正在尝试查找 li - 例如,span text = 2 这样我就可以点击它了。
您已经解决了与 then 的承诺,因此 returns 一系列跨度项目。返回数组后,您应该使用 getText():
tabs[i].findElements(By.tagName("span"))
.then(function(spanArray){
console.log('Found spans length:'+ spanArray.length);
spanArray.forEach(function(nextElement) {
nextElement.getText().then(function(text) {
console.log('Text Found' + text);
// An if then check is required here so only
// one done is called.
if (/*---your condition here ---*/) {
done();
}
});
});
});
编辑 修改上面的代码片段以处理数组然后处理每个元素。
进一步评论 添加关于 XPATH 方法的@sferret 评论。
或者使用 XPATH,它可以最大限度地减少所需的代码量和处理量:
var tab=driver.findElement(By.xpath(".//div[@id='Tabs']/ul/li/span[contains(.,'two')]"));
然而,由于示例中的跨度或 div 移动,xpaths 可能很快成为维护问题,因此应注意。您必须考虑页面中可能发生的变化并采取相应措施。少量不会随时间变化的 JS 代码是否比 xPaths 更重,xPaths 理论上每周都会更改,因为选项卡在页面中的位置。