2016-03-22 9 views
0

Ich versuche derzeit, eine E2e-Test einer Website, die stark auf AngularJs mit Selen/Fluentlenium beruht zu implementieren.Abrufen von Selen <tr> WebElements nach AngularJs füllt Tabelle

Ich habe diesen Ansatz vorher ohne Probleme verwendet, aber es scheint, als ob phantomJS mit Angular einfach nicht umgehen kann.

Wenn ich "Seitenquelle" in Chrome anzeigen, sehe ich nur die Bindungen (z. B. {{object.item}}), wenn ich aber "inspect element", bekomme ich, was ich erwarte den Inhalt.

Sagen wir unsere html wie folgt aussieht (und wird von $ http geladen und übernehmen $ scope.loading falsch ist nach scope.objects besiedelt $):

<table ng-show="!loading" id="itemList"> 
<tbody> 
    <tr ng-repeat="object in objects"> 
     <td class="item1">{{ object.item1 }}</td> 
     <td class="item2">{{ object.item2 }}</td> 
     <td class="item3">{{ object.item3 }}</td> 
     <td class="itemSafe"><input type="checkbox" disabled="true" ng-checked="object.itemSafe == 1"></td> 
    </tr> 
</tbody> 
</table> 

Bisher ist dies, was ich habe :

private static final int TIMEOUT = 10; 
private static final int PORT = 3333; 
protected static final String URL = "http://localhost:" + PORT; 

public static PhantomJSDriver driver = setupWebDriver(); 
public static WebDriverWait wait = new WebDriverWait(driver, TIMEOUT); 
public static TestBrowser browser = testBrowser(driver); 

    private static PhantomJSDriver setupWebDriver() { 
     DesiredCapabilities caps = new DesiredCapabilities(); 
     caps.setJavascriptEnabled(true); 

     LoggingPreferences logPrefs = new LoggingPreferences(); 
     logPrefs.enable(LogType.BROWSER, Level.ALL); 
     caps.setCapability(CapabilityType.LOGGING_PREFS, logPrefs); 

     String path = findDriverPath(); //Not relevant, just finds the binary 
     caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, path); 
     return new PhantomJSDriver(caps); 
    } 

    @Before 
    public static void setup() throws Throwable { 
     driver.manage().window().setSize(new Dimension(1280, 720)); 
     driver.get(URL); 
    } 

    @Test 
    public void testFindItem1(){ 
      browser.$("#items").click(); //opening site has link with id 
      wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("itemList"))); //table element 
      browser.$("#filter").text("item1Text"); //input element for filtering 
      List<WebElement> item1s = driver.findElements(By.className("item1")); 
      for(WebElement item1: item1s){ 
      System.out.println(item1.getText()); //outputs "{{ object.item1 }}" once <-- MY PROBLEM 
     } 
    } 

.... dies nur zu "{{object.item1}}" einmal gedruckt werden, aber perfekt in Chrome funktioniert.

EDIT: Es tut mir leid meine Frage nicht klar genug war, sollte ich das folgende Stück JavaScript-Code enthalten sind:

$scope.objects = [{item1: "one", item2: "two", item3: "three", itemSafe: "1"}, {item1: "four", item2: "five", item3: "six", itemSafe: "0"}]; 
$scope.loading = false; 

Da meine erwartete html ist:

<tr> 
<td class="item1">one</td> 
<td class="item2">two<td> 
<td class="item3">three</td> 
<td class="itemSafe"><input type="checkbox" disabled="true" ng-checked="object.itemSafe == 1"></td> 
</tr> 
<tr> 
<td class="item1">four</td> 
<td class="item2">five<td> 
<td class="item3">six</td> 
<td class="itemSafe"><input type="checkbox" disabled="true" ng-checked="object.itemSafe == 1"></td> 
</tr> 

Bitte beachten Sie, dass bei diesem JSON-Array das erste Kontrollkästchen aktiviert sein sollte, das zweite jedoch nicht.

+0

Basierend auf dem HTML, das Sie eingefügt haben, ist dies das richtige Verhalten - es gibt nur ein Element mit der Klasse "item1". Sie können einen xpath verwenden, um alle relevanten Elemente zu finden oder alle "td" -Tags zu erhalten und sie vor der Verarbeitung zu filtern. – skandigraun

Antwort

0

Sieht aus wie Ihre Selen korrekt nach Ihren Code arbeiten - es gibt nur ein Element mit Klasse = „item1“

Was möchten Sie wahrscheinlich so etwas wie

List<WebElement> item1s = driver.findElements(By.tagName("td")); 

Wenn das nicht der Fall ist produzieren Sie die Ergebnisse, die Sie wünschen, erklären Sie bitte klarer, was das korrekte erwartete Resultat ist.

+0

Ich habe die Frage bearbeitet, um klarer zu sein. – Raudbjorn