2016-04-05 5 views
0

Ich arbeite an einigen Testautomatisierung für eine RIA, die ich geschrieben habe, und ich habe einige Probleme bei der Suche nach einer bestimmten Zeichenfolge innerhalb des DOM, klicken Sie dann auf der DIV, der die Zeichenfolge einkapselt. Ich verwende Selen mit Gurke.Suchen nach einer Zeichenfolge, dann klicken Sie auf das Eltern DIV mit Selenium

Die Struktur meiner Tests wie folgt aussehen:

├── app 
│   ├── containers 
│   │   ├── AddCustomerContainer.java 
│   │   ├── HomePageContainer.java 
│   │   ├── LoginErrorPageContainer.java 
│   │   └── LoginPageContainer.java 
│   ├── NaviagtorFactory.java 
│   ├── Navigation.java 
│   ├── User.java 
│   ├── Users.java 
│   └── view 
│    ├── AddCustomerView.java 
│    ├── HomeView.java 
│    ├── LoginErrorView.java 
│    └── LoginView.java 
├── constants 
│   ├── Browsers.java 
│   ├── CredentialsType.java 
│   └── Outcome.java 
└── utils 
    ├── BrowserDriver.java 
    ├── BrowserFactory.java 
    └── FileUtils.java 

die Tests von Navigation.java ausgeführt werden, das ist, wie ich für eine Zeichenfolge zu suchen versuche dann darauf klicken der Eltern zur Zeit:

//Navigation.java  
public void given_I_navigate_to_the_add_customer_page(){ 
     BrowserDriver.loadPage("localhost:3000"); 
     AddCustomerView.clickAddCustomer(); 
    } 

dann in AddCustomerView.java:

private static final AddCustomerContainer addCustomerContainer = PageFactory.initElements(BrowserDriver.getCurrentDriver(), AddCustomerContainer.class); 

public static void clickAddCustomer(){ 
    LOGGER.info("Navigating to Add Customer"); 
    addCustomerContainer.getAddCustomerButton().click(); 
} 

AddCustomerContaine r.java:

@FindBy(how = How.XPATH, using = "//*") 
    public WebElement all; 

public WebElement getAddCustomerButton(){ 
    WebElement button = BrowserDriver.getText(all, "Add customer"); 
    return button; 
} 

Und das ist die getText Funktion im BrowserDriver.java

public static WebElement getText(WebElement element, String value) { 
    return element.findElement(By.partialLinkText(value)); 
} 

Der Text ich suche ist "Hinzufügen des Kunden mit dem XPath // * aber die Tests, wenn Run Selen nur scheinbar kann die Zeichenfolge nicht finden.

In Bezug auf Struktur und Treiber eingerichtet, alles ist in Ordnung, da ich mehrere andere Tests laufen, die wie erwartet funktionieren. Eine Saite zu finden, ist jedoch ein Rätsel.

Ich habe verschiedene Methoden versucht, die Zeichenfolge zu bekommen:

return element.findElement(By.linkText("Add customer")); 
return element.findElement(By.partialLinkText("Add customer")); 
return element.findElement(By.xpath("//*[contains(text(),'Add customer')]")); 

von denen keine Arbeit ... Irgendwelche Vorschläge? Prost!

Edit: Dies ist der HTML ist, ist es erwähnenswert, dass diese in einem Rahmen erscheint jedoch verwendete ich Chrom XPath zu bekommen und es war //*[@id="login-success"]/p[1]/a[2]:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title> 
OATime 
</title> 
<link href="style.css" rel="stylesheet" type="text/css"> 
<meta http-equiv="refresh" content="30"> 

<style type="text/css"></style></head> 

<body id="login-success" class="chooser"> 
<br> 
<p align="center"> 
<strong>version_TOKEN</strong> 
<br> 
<br> 
<a target="main" href="/customer-list" class="screenlink">List customers</a><br> 
<a target="main" href="/customer-edit" class="screenlink">Add customer</a><br> 
<br> 
<a target="_top" href="/logout" class="screenlink">Sign out</a> 
</p> 
</p> 
</body></html> 
+0

Können Sie den HTML-Code zur Verfügung stellen? –

+0

Ich habe das noch nie gesehen. Sie verwenden die Seiten-Factory, um mit dem XPath-Ausdruck '// *' ein Element namens 'all' zu finden. Dadurch wird eine Liste von Webelementen zurückgegeben, aber Sie speichern nur eine einzelne WebElement-Instanz, die wahrscheinlich die erste im Dokument ist, normalerweise ''. Ist das der übliche Weg in Gurken? Sieht mir ein bisschen komisch aus. –

+0

zugegebenermaßen habe ich die Konvention der Verwendung von @FindBy mit einer bestimmten ID folgen, dies ist das erste Mal, dass ich es so gemacht habe, nahm ich an, dies war die Möglichkeit, das gesamte DOM nach Text zu suchen –

Antwort

1

Mit Selen Sie den Kontext setzen müssen auf dem Rahmen, wo das Zielelement ist. Also in Ihrem Fall sollte es so etwas wie diese:

@FindBy(how = How.XPATH, using = "//*") 
public WebElement all; 

public WebElement getAddCustomerButton(){ 
    BrowserDriver.switchTo().frame(0); 
    WebElement button = BrowserDriver.getText(all, "Add customer"); 
    return button; 
} 

Und den Standardkontext setzen zurück, wenn Sie mit dem Rahmen fertig sind:

BrowserDriver.switchTo().defaultContent(); 
+0

bekommen:'/autotest/src/main/java/com/autotest/app/container/AddCustomerContainer.Java: [18,15] Fehler: Ich finde das Symbol nicht, wenn ich switchTo() auf 'BrowserDriver.switchTo(). frame (0);' –

+0

Da es sich um eine angepasste Implementierung handelt, könnte es sich um BrowserDriver.Instance.switchTo handeln() .frame (0); –

+0

Sie müssen die Instanz des Webtreibers oder die switch-Methode in BrowserDriver finden, damit es funktioniert. Die BrowserDriver-Klasse ist kein Teil des Selenium-Frameworks. –

Verwandte Themen