Wie beseitigen xpaths in Webdriver-code?
Ich arbeiten auf die Automatisierung einer website und ich bin versucht, einen Weg finden, um zu reduzieren die Verwendung von XPath-Ausdrücken in meinem code.
Mein code sieht ungefähr so aus
driver.findElement(By.xpath("//html/body/center/div/div/center/table/tbody/tr/td/form/table/tbody/tr[3]/td/input")).click();
driver.findElement(By.xpath("//html/body/div/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td")).getText();
driver.findElement(By.xpath("//html/body/div/table/tbody/tr/td/div[2]/div/div/div[4]/div/div/div")).click();
driver.findElement(By.xpath("//html/body/div[3]/div/div/div/div[2]/div/span/ul[2]/li[6]/a")).click();
/*driver.findElement(By.xpath("//html/body/div/div/div/div[3]/div/div[2]/div[2]/table/tbody/tr/td[3]/table/tbody/tr/td[2]/em/button")).click();
WebElement editUserForm = driver.findElement(By.cssSelector("iframe[src*='editUserForm']"));
Gibt es eine Möglichkeit, ich kann reduzieren diese XPath-Angaben, so dass meine codes sehen auch nicht schäbig ?
Einer der member hier mir vorgeschlagen "verwenden Sie Bitte nicht absoluter xpath". Was bedeutet es ?
Bitte helfen Sie. Auch lassen Sie mich wissen, wenn es irgendeinen link, der mir helfen wird, mich auf dieser.
Ist es möglich, erstellen Sie eine Datei, die einen string xpath-Zeiger, und dann können wir nur die Zeichenfolge in den code ?
- Sicherlich einige Ihrer Elemente ein id-Attribut besitzen. Zum Beispiel, wenn eine dieser Tabellen mit der id "Rechnungen", die Sie nutzen könnten
//table[@id='invoices']
abzuschneiden alles, bevor der Tisch-Achse Schritt. Lesen Sie einige XPath-tutorial, du bist noch immer fehlen die Grundlagen von XPath und ändern kann, dass innerhalb einer Stunde. Wenn Sie verwenden möchten, Selen, stick mit XPath 1.0-bei der Auswahl einige Tutorials, neuere Versionen werden nicht unterstützt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie investieren in Page-Objekte, es ist eine sehr nützliche Muster:
https://code.google.com/p/selenium/wiki/PageObjects
Wird es helfen, separaten test der Implementierung. Ich meine, der test sollte gelassen werden detailliert, welche Schritte unternommen werden, die Umsetzung (das "page object') sollte detailliert wie diese Schritte unternommen werden.
Als für den XPath selbst, ja, Sie sind ziemlich schlecht & unzuverlässig. Ich würde davon ausgehen, Sie habe Sie automatisch für Sie erzeugt durch irgendein tool, vielleicht ist das IDE oder Firebug. Bitte werfen Sie diese Weg nun, nicht immer wieder verwenden, und Lesen Sie einige XPath-tutorials - auch die XPath-Spezifikation ist ein toller Lernort.
Erstens fallen die
//html/body
bisschen, es ist nicht mehr benötigte, und macht es schlechter Aussehen. Es funktioniert gut, ohne es.Zweitens, ja, mit absoluten XPath-Ausdrücken (ich.e, diejenigen, die basierend auf der position) sind schlecht. In Ihrem ersten XPath:
Sehen, dass final
tr[3]
? Was wenn ich einen stick einer anderen Zeile (tr
) vor, dass man? Es bedeutet, dass Sie jetzt Ihren XPath werden sollte:Also es bedeutet, daß der test unterbrochen wird. Allerdings, der test wird nicht brechen, weil die Funktion des Tests ist gebrochen, es ist gebrochen, weil die test-Implementierung ist beschädigt. Sollten Ihre tests nicht sein, dass Blätterteig. Wenn ein Entwickler will, einen Stock
tr
oben, dass du willst, in Ordnung, es sei denn, es bricht die eigentliche Sache, die Sie testen, dann ist dein test sollte noch passieren.Sollten Sie darüber nachdenken, es anders. Denke über andere Wege, die auf das element. Sagen wir, ich habe dieses:
Möchte ich, um die Spannweite mit
docSpan
wie es ist Klasse name.Könnte ich entweder:
Die funktionieren würde, aber was ist, wenn es sich verändert:
Bedeutet es, die
[1]
bit ist nicht mehr gültig.So, ich könnte:
Was bedeutet, es ist nur zu Versagen, wenn die
span
ich möchte aus der ein Kind von der span mit einer KlasseuploadDetails
oder dieuploadDetails
Klasse ist übernommen aus dem span insgesamt.Oder ich könnte:
Dies bedeutet, es ist nur zu Versagen, wenn die Spanne bewegt insgesamt, und nicht mehr ein Kind, dass "Eltern" - div.
Bottom line ist, verlassen Sie sich nicht auf Positionen. Denken Sie über das, was in der Nähe dieses Elements. Gibt es etwas, was mit einer Klasse? Gibt es etwas, was mit text drin? Gibt es etwas, was mit einer ID in der Nähe von es?
Hier wieder Y XPath-Y, Nicht zu gehen mit CSS
css=.uploadDetails > .docSpan -- .doc
css=.uploadDetails > .excelSpan -- .xls
css=.uploadDetails > .txtSpan -- .txt
Einfach