2016-09-20 7 views
0

Ich habe eine HTML-Seite (Öffnen mit Firefox und/oder Chrome), und ich versuche, den richtigen XPath des (Bild-) Elements zu finden, das ich versuche, auf die Webseite zu klicken. Ich kodiere in C# mit Selenium Automation. So sieht das Element aus, wenn ich mit der rechten Maustaste klicke und inspect wähle:Selen XPath nicht gefunden Fehler in C#

(Die eigentliche Website ist zu lang, also subbing ich sie mit {website} und {different-website}).

EDIT: Tut mir leid, ich habe vergessen, aber die {Website} ist dynamisch. Und {different-website} ist statisch.

<a href="https://{website}"> 
<img border="0" alt="open now" src="https://{different-website}.gif"> 
</a> 

Ich versuche, das img mit meiner Automatisierung zu klicken, aber alles, was ich die Automatisierung versuche nicht und sagt: „Nicht imstande Element zu finden“. Ich stelle fest, dass der img versucht zu klicken ist irgendwie verschachtelt in die oben genannten {a} -Element. Vielleicht ist es deshalb so schwierig auszuwählen und anzuklicken. Ich habe versucht, Dinge wie:

driver.FindElement(By.XPath("//a[starts-with(@href='https://www.{website}')]")).Click(); 

driver.FindElement(By.XPath("//a[contains(@href='https://www.{website}')]")).Click(); 

driver.FindElement(By.XPath("//img[(@src,'img1935.gif')]")).Click(); 

driver.FindElement(By.XPath("//img[(@src,'img1935.gif')]/../a")).Click(); 

driver.FindElement(By.XPath("//a[not(@href)/img/@src | //a[img]/@href")).Click(); 

driver.FindElement(By.XPath("//a[@alt='open now']/@src")).Click(); 

driver.FindElement(By.XPath("//img[@alt='open now']/@src")).Click(); 

All diese zurückgegeben „Unable Element zu lokalisieren“ und ich bin fest auf was soll ich sonst tun oder versuchen. Irgendwelche Vorschläge würden sehr geschätzt werden. Vielen Dank.

Antwort

0

Viele Ihrer XPaths finden nicht, was Sie suchen.Haben Sie versucht etwas einfaches wie

Wenn dies nicht funktioniert, müssen Sie weitere Informationen oder einen Link zu der Seite bereitstellen.

+0

Das funktioniert nicht auch ich kann nicht wirklich die Website Link geben, weil es klassifiziert ist (daher das dynamische Verhalten), aber das einzige, was ich wirklich sehen kann, wenn ich die inspiziere Webseite ist das, was ich versuche zu klicken, ist innerhalb eines Absatzes geschachtelt. Danke, dass du versucht hast, auch zu helfen – CRich

+0

Versuche dies ... gehe zu der Seite, die du benutzt und tippe '$ x (" // a/img [@ alt = 'öffne jetzt'] ")' in der Dev-Konsole ... Was gibt es zurück? – JeffC

+0

Hmm ... Ich habe 3 davon auf der Seite, nachdem ich das eingegeben habe. Ich habe 3 gleiche Bilder mit genau diesem XPath. Vielleicht konnte Selen das deshalb nicht finden. Aber seit ich 3 habe, hätte ich nicht einen finden können? – CRich

0

Versuchen //a[@href="https://{website}"]/img[1]

  • Alle a Elemente (wo href = "http: // {website}")
  • Dann das erste img geordnetes Element dieser Elemente auswählen

können Sie test it here - diese Website wird auch Vorschläge machen.

ich this page wirklich nützlich, wenn XPath

+0

Danke für die Antwort, aber das wird nicht mit einer dynamischen {Website} arbeiten, die ich versucht habe. – CRich

0

Wenn Sie die dynamische Urls haben zu arbeiten, versuchen Sie sollten mit festen Pfad im selector.You vermeiden kann, wie etwas verwenden:

//a[contains(@href, 'part_of_href_value')] 

Wenn die Link wird für verschiedene Webseiten übersetzen Sie so etwas wie verwenden:

//a[contains(@href, 'part_of_href_value1') or contains(@href, 'part_of_href_value2') or contains(@href, 'part_of_href_value3')]

Sie c Verwenden Sie einen beliebigen Teil der href. Sie können auch die oben Selektoren für Bilder anpassen, ersetzen a mit img und @href mit @src

Beispiel: Ich habe 2 Links mit href suchen:
href= https://www.example1.com/blabla/page
href= http://www.second-example.org/bla/page-s

beiden Links zu wählen, i Beispiel Wort verwenden da gemeinsam:
//a[contains(@href, 'example')]

durch unterschiedliche Teile/Worte beiden Links wählen:
//a[contains(@href, 'blabla/page') or contains(@href, 'bla/page')]

+0

Ich habe das auch versucht, es findet das Element nicht, indem es enthält. Auch wenn ich auf die Website gehe, um sie wie folgt zu enthalten: "// a [contains (@ href, 'https: // {website}']]", macht das "//" den gesamten Website-Link blau. Ich weiß nicht, ob es das Element wegen des "//" nicht findet. Ich nehme auch an, wenn ich contains verwende, muss ich von "https: //" ausgehen, muss aber nicht die ganze Website-Adresse eingeben. Ist das korrekt? – CRich

+0

Nein. Wenn Sie contains verwenden, können Sie von überall starten und das benötigte Teil kopieren. – lauda

+0

Ich habe es auch ausprobiert, ohne das "https: //" zu benutzen und ich hatte kein Glück damit das Element zu finden. So wie: //a[contains(@href,'https://www.google.com/search/help ')] "gab mir kein Glück. Außerdem habe ich es so ausprobiert: // a [enthält (@ href, 'https: // search/help')] "das gab mir auch kein Glück – CRich