2016-05-11 8 views
0

Hallo, ich benutze Mokka und Knoten js, und versuche Selen Webdriver arbeiten zu bekommen. Die App ist ein SPA. Alles, was ich tun möchte, ist einen bestimmten Tab zu bekommen, und klicken Sie darauf. Ich habe die HTML in den Test OK geladen. hier ist ein AusschnittSelenium.Webdriver versucht, eine Registerkarte Text zu finden vaue

<div id="Tabs"> 
    <ul> 
     <li> <span> one </span></li> 
     <li> <span> two </span></li> 
     ... 
     <li> <span> six </span></li> 
    </ul> 
    </div> 

In meinem test.js ich diese haben ...

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(); 
        }); 
    } 
});)}; 

Er übergibt den "wir haben einige Tabs" aber nicht "eine Registerkarte Name finden können" mit diesem Fehler

1 failing

1) MYHtml can find tab name: TypeError: span.getText is not a function

ich versuche, das li zu finden - zum Beispiel mit der Spanne text = 2 so kann ich darauf klicken.

Antwort

0

Sie haben das Versprechen mit dann gelöst und so ein Array von Span-Elementen zurückgegeben. Sie sollten verwenden getText(), sobald das Array zurückgegeben:

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(); 
         } 
        }); 
       }); 
      }); 

EDIT Code-Schnipsel oben revidiert mit Array zu bewältigen und verarbeiten dann jedes Element.

Weiterer Kommentar Hinzufügen von @sferret-Kommentar zum XPATH-Ansatz.

Alternativ verwenden XPath, die die Menge an Code und Verarbeitung benötigt minimieren:

var tab=driver.findElement(By.xpath(".//div[@id='Tabs']/ul/li/span[contains(.,'two')‌​]")); 

Allerdings sollte darauf geachtet werden, wie XPaths schnell ein Wartungsproblem auf die Spanne fällig werden kann oder div im Beispiel zu verschieben. Sie müssen überlegen, was sich auf der Seite ändern kann und entsprechend handeln. Ist eine kleine Menge von mehr JS-Code, die sich im Laufe der Zeit nicht ändern, mehr Last als xPaths, die theoretisch jede Woche aufgrund der Position der Registerkarte in der Seite ändern könnte.

+0

Danke für die Antwort Peter, leider bekomme ich immer noch den TypeError: tabs [i] .findElements (...). GetText ist keine Funktion – sferret

+0

Es gibt ein paar Probleme mit dieser Antwort. Ein Hauptproblem besteht darin, dass es keine Vorkehrung gibt, um Mocha anzuzeigen, wenn dieser asynchrone Code vollständig ausgeführt ist (entweder durch Aufrufen von "done" oder durch Zurückgeben eines Versprechens). – Louis

+0

Ich habe die done() zurück zum Code, es wurde versehentlich entfernt. Offensichtlich kehrt der @ sferret zu dem ursprünglichen Test zurück, um zu entscheiden, was er von einer Reihe von Spannen erwartet, da das Original andeutete, dass ein einzelner Wert ('kann einen Tabnamen finden') benötigt wird. – PeterS

Verwandte Themen