2016-12-12 1 views
1

Ich wurde damit beauftragt, einen Selentest (mit Python) auf einer Webseite bereitzustellen, für die ich den Quellcode nicht geschrieben habe (ich weiß nicht viel über Webentwicklung, aber von was? Mir wurde gesagt, es wurde mit D3 und JQuery geschrieben). Die Website generiert Grafiken, und es gibt einige Dropdown-Menüs mit Optionen. Ich versuche, alle möglichen Graphen mit diesen Optionen zu erstellen. Dazu erstelle ich aus dem Dropdown-Menü WebElement ein Select-Objekt und extrahiere den Text jeder Option im Dropdown-Menü. Später benutze ich diesen Text, um rekursiv jedes Dropdown zu durchlaufen und jede gültige Option einzugeben, um die Graphen zu erzeugen. Allerdings stolpere ich manchmal (nicht immer, und es scheint relativ zufällig zu sein) auf eine StaleElementReferenceException, während ich versuche, diese Liste von Optionen zu extrahieren, und zwar aufgrund des folgenden Codes (der auf der Zeile passiert). Ich habe frühere Fragen und Dokumentationen zu dieser Ausnahme durchsucht, und ich muss noch eine Antwort finden, die mir hilft.Python Selenium StaleElementReferenceException während des Durchlaufens Wählen Sie Optionen

#find all of the options 
# create list of string options before, so as to avoid StaleElementReferenceException's 
# as much as possible 
el = driver.find_element(By.ID,node.element) 
d = Select(el) 
options = [] 
for op in d.options: 
    try: 
     options.append(op.get_attribute("text")) 
    except StaleElementReferenceException: 
     print >>sys.stderr, 'StaleElementReferenceException getting text from \'' + node.element + '\' element' 

Jede Eingabe ist sehr hilfreich! Vielen Dank.

EDIT: Hier ist ein HTML-Snippet Beispiel einer der Dropdown-Listen:

<select class="dropdown" id="datatype" name="datatype" style="display: none;"> 
    <option value="solar_radiation" selected="selected">solar radiation</option> 
    <option value="windspeed">windspeed</option> 
    <option value="airtemperature">airtemperature</option> 
    ... 
</select> 
+0

http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp –

+0

Dank für den Rat! Ich habe diese Dokumentation bereits durchgesehen, und ich verstehe ziemlich gut, was die Ausnahme bedeutet. Ich bin mir nicht sicher, warum ich es in diesem Fall bekomme oder wie ich es vermeiden kann. – AndyW

+0

wird bei Auswahl einer Option die Seite aktualisiert oder das DOM geändert? Wenn ja, verursacht das Ihr Problem. Sie verwenden einen Verweis auf ein Element, das geändert wurde –

Antwort

1

Ich bin misstrauisch d = Select(el)

Wenn Sie nur alle Texte erhalten möchten, können Sie vielleicht wie tun:

optionNodes = driver.find_element_by_id("datatype").find_elements_by_tag_name("option") 
options = [] 
for op in optionNodes: 
    options.append(op.get_attribute("text")) 

Wenn der Code oben nicht (seltsam, obwohl) nicht funktioniert, versuchen Sie vielleicht Skript auszuführen, wie:

driver.execute_script("return Array.apply(null, document.getElementById('datatype').options).map(function (option) {return option.text})"); 
+0

Leider hat das das Problem nicht gelöst. Immer noch dieselbe StaleElementReferenceException für diese get_attribute-Zeile – AndyW

+0

Können Sie den HTML-Code für die Auswahl angeben? –

+0

Ich habe den ursprünglichen Post so bearbeitet, dass er ein Snippet enthält. – AndyW

1

Es wird eine schmutzige Abhilfe mit Indizes über die Optionsliste zu durchlaufen und die Liste neu zu besiedeln, wenn Sie die

Ausnahme begegnen
el = driver.find_element(By.ID,node.element) 
select = Select(el) 
options = select.options 
options_texts = [] 
for i in range len(options)): 
try: 
    options_texts.append(options[i].get_attribute("text")) 
except StaleElementReferenceException: 
    el = driver.find_element(By.ID,node.element) 
    select = Select(el) 
    options = select.options 
Verwandte Themen