2017-11-03 3 views
0

Ich habe mein Gehirn schon einige Zeit damit beschäftigt und kann es anscheinend nicht herausfinden ... Ich möchte gerade auf eine E-Mail in meinem Yahoo Account klicken. Wenn ich die Werte des Gesuchten festlege, funktioniert es bei der Suche nach der ersten E-Mail. Ich muss in der Lage sein, jede E-Mail basierend auf dem Thema zu finden. Dies funktioniert das erste Thema klicken, wenn es enthält „POST/Ändern/Löschen: * 2007 keine Schäden TOYOTA XLE“Xpath Enthält eine Variable

wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE')]"))).click(); 

Wenn ich es eine Variable, auf der anderen Seite machen es nicht:

String emailtitle = "POST/EDIT/DELETE: "+ "*2007 NO DAMAGE TOYOTA CAMRY XLE";//Build email string 
System.out.println("Email Title is: "+ emailtitle); 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'" + emailtitle + "')]"))).click(); 

Wo ich suche:

<div class="subj" role="gridcell" id="yui_3_16_0_ym19_1_1509685997190_1725"> <span dir="" class="subject " title="POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE (cars &amp; trucks - by owner)" id="yui_3_16_0_ym19_1_1509685997190_1724"> POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE (cars &amp; trucks - by owner) </span> <span class="thread-snippet" role="gridcell" dir="" id="yui_3_16_0_ym19_1_1509685997190_1754"> IMPORTANT - FURTHER ACTION IS REQUIRED TO COMPLETE YOUR REQUEST !!! FOLLOW THE WEB ADDRESS BELOW TO: PUBLISH YOUR AD EDIT (OR CONFIRM AN EDIT TO) YOUR AD VERIFY YOUR EMAIL ADDRESS DELETE YOUR AD If not clickable, please copy and paste the address to your browser: THIS LINK IS A PASSWORD. DO NOT SHARE IT - anyone who has a copy of this link can edit or delete your posting. link PLEASE KEEP THIS EMAIL - you may need it to manage your posting! Your posting </span> </div> 

emailtitle Änderung habe ich möchte in der Lage sein, basierend auf dem Titel der E-Mail-Ideal. Also ist die Verwendung einer Variablen ein Muss. Aber aus irgendeinem Grund, wenn ich es als Variable verwende, gibt es keinen Wert zurück. Gibt es einen Grund, warum das passieren würde?

+0

Ihr erster Codeblock hat den Text 'POST/Ändern/Löschen:' zweimal, so dass sollte nicht gearbeitet haben. – Andreas

+0

Ja, meine Anforderung besteht darin, auf die E-Mail zu klicken, die auf dem Titel der E-Mail basiert. – Kabone

+0

E-Mail-Titel nicht unter doppelten Anführungszeichen ausgeben, da es eine Zeichenfolge ist, behalten Sie es ohne Anführungszeichen und überprüfen Sie By.xpath ("// * [contains (text(), emailtitle)])) –

Antwort

0
  1. Versuchen Sie, die Stringemailtitle einfach wie:

    String emailtitle = "POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE"; 
    
  2. Statt:

    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'" + emailtitle + "')]"))).click(); 
    

    können Sie versuchen:

    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[.='" + emailtitle + "']"))); 
    
  3. wait wird das Element zurückgeben, wenn es gefunden wird. Also nimm Hilfe von WebElement und rufe click() im nächsten Schritt auf.

    WebElement elem = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[.='" + emailtitle + "']"))); 
    elem.click(); 
    
+0

Ein Element kann nicht mit By.xpath gefunden werden: //*[.='POST/EDIT/DELETE: * 2007 KEINE BESCHÄDIGUNG TOYOTA CAMRY XLE '] – Kabone

+0

Versuchen Sie den aktualisierten Code bitte – DebanjanB

+0

verursacht durch: org.openqa.selenium.NoSuchElementException: kann nicht ein Element mit By.xpath lokalisieren: //div[.='POST/EDIT/DELETE: * 2007 keine Schäden TOYOTA XLE '] – Kabone

0

Try this einmal

String emailtitle = "POST/EDIT/DELETE: "+ "*2007 NO DAMAGE TOYOTA CAMRY XLE";//Build email string 
System.out.println("Email Title is: "+ emailtitle); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[text(),emailtitle]"))); 
driver.findElement(By.xpath("//*[text(),emailtitle]")).click(); 

Im Fall, wenn Sie XPath mehrere Elemente kehren dann versuchen Sie Ihr spezifisches Element suchen, basierend auf Index wie

...By.xpath(" 
(//*[text(),emailtitle]")[1]).click()//try with different like 0,1,2 

Wie Sie sehen können Im unteren Bild hat mein xpath 7 Übereinstimmungen zurückgegeben, also habe ich über die Indizierung versucht, mein spezifisches Element zu bekommen, und nach dem neuen xpath kann ich auf klicken das Element enter image description here

+0

Kann nicht ein Element mit By.xpath lokalisieren: //*[.=emailtitle] – Kabone

+0

meine Antwort bearbeitet, bitte einmal überprüfen –

+0

Ich habe versucht, durch die gefundenen Elemente Looping und klicken aber immer noch nicht, es zu finden :( I beschlossen, zu versuchen, den Text jedes Elements zu erhalten, das ich durchschlug und schaffte, eines der Elemente zurück zu haben - POST/BEARBEITEN/LÖSCHEN: * 2007 KEIN SCHADEN TOYOTA CAMRY XLE (Autos & Lastwagen - durch Inhaber) aber es didnt wähle es – Kabone

0

Es ist am besten zu vermeiden, XPath-Ausdrücke mit Zeichenfolgenverkettung zu erstellen. Im besten Fall können Sie Probleme wie diesen debuggen, da Sie sich in ein Problem mit Anführungszeichen und Leistungsproblemen begeben, da Sie den Ausdruck jedes Mal neu kompilieren, wenn Sie ihn ausführen. Im schlimmsten Fall ist Ihr Code für Injektionsangriffe offen.

Ich bin mir nicht ganz sicher, von den Tags in Ihrer Frage, was XPath API Sie verwenden, aber die meisten XPath-APIs ermöglichen es Ihnen, einen Ausdruck, die eine variable Referenz zu kompilieren:

x = xpath.compile("//something[contains(@att, $value)]"); 

dann einen Wert liefern für der Parameter zur Ausführungszeit, so etwas wie:

y = x.load(); 
y.setParam("value", theValueIAmLookingFor) 
y.evaluate();