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>
Können Sie den HTML-Code zur Verfügung stellen? –
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. –
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 –