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 理论上每周都会更改,因为选项卡在页面中的位置。