2017-01-06 7 views
0

Zuerst habe ich einen Code in Selenium IDE firefox Addon erstellt, die Daten von der Website schabt. Natürlich funktioniert es in IDE richtig.Selen C# - Element nicht gefunden

Ich möchte von dieser URL kratzen:

<div class="gs-per-result-labels" url="http://example.com/foo/bar"></div> 

Als HTML wird wie folgt angezeigt:

<tr> 
    <td>open</td> 
    <td>http://example.com</td> 
    <td></td> 
</tr> 

<tr> 
    <td>storeAttribute</td> 
    <td>//div[@class='gs-per-result-labels']@url</td> 
    <td>myValue</td> 
</tr> 

<tr> 
    <td>echo</td> 
    <td>${myValue}</td> 
    <td></td> 
</tr> 

Beide Befehl richtig ausgeführt werden und echo wird richtigen Wert zu geben. Als nächstes änderte ich das Format in C#/NUnit/WebDriver und ich kopierte Code nach Visual Studio 2015. Ich fügte FirefoxDriver und IWebDriver Referenzen hinzu. Das ist der Code:

private static IWebDriver driver; 
static void Main(string[] args) 
{ 
    driver = new FirefoxDriver(); 

    driver.Navigate().GoToUrl("http://example.com"); 
    Thread.Sleep(10000); 
    string myValue = driver.FindElement(By.XPath("//div[@class='gs-per-result-labels']")).GetAttribute("url"); 
} 

Ich habe auch Sleep sicher sein, dass die Seite vollständig geladen ist, wenn es um Schaben Wert kommt. Die Sache ist, ich bekomme Fehler auf FindElement Funktion, weil driver Element nicht finden konnte. Ich frage mich, warum das passiert. Alles scheint gleich zu sein. Hast du irgendwelche Tipps?

Ich denke, es lohnt sich zu sagte: Der Inhalt, die ich kratzen wollen wird von PHP oder Javascript erzeugt (das ist sind Google Suchergebnis auf „Beispiel“ Seite, die Google ist nicht)

+0

Ihre HTML-Probe enthält keine 'div' s. Ist das beabsichtigt? – Stuart

+0

Es gibt '// div [@ class = 'gs-per-result-labels']' –

+0

Also XPath fragt XML ab, das fragt '// div [@ class = 'gs-per-result-labels']' ab Suchen Sie nach "div" -Elementen mit einem "class" -Attribut mit dem Wert "gs-per-result-labels". Es wird keine Nur-Text-Suche des HTML-Bodys durchgeführt. – Stuart

Antwort

0

beste Ansatz wäre, Überprüfen Sie, ob der Xpath absolut korrekt ist. Sie können immer Firebug verwenden oder wenn Sie es programmatisch tun wollen, sollten unten Linien helfen

List<WebElement> existList=driver.FindElement(By.XPath("//div[@class='gs-per-result-labels']")); 
if(existList.size()>0){ 
    //SOPL("element present"); 
} 

Ich würde vorschlagen, Sie explizite Wartezeit verwenden

WebDriverWait wait=new WebDriverWait (driver,60); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.XPath("//div[@class='gs-per-result-labels']"))); 
    string myValue = driver.FindElement(By.XPath("//div[@class='gs-per-result-labels']")).GetAttribute("url");