2015-01-13 15 views
20

Ich wurde beauftragt, einen Parser zu schreiben, um auf eine Schaltfläche auf einer Website zu klicken, und ich habe Probleme, nur eine der Schaltflächen zu klicken. Der folgende Code funktioniert für jede Schaltfläche außer einer.Selen Element nicht sichtbar Ausnahme

Hier ist der html: http://pastebin.com/6dLF5ru8

hier ist die Quelle html: http://pastebin.com/XhsedGLb

Python-Code:

driver = webdriver.Firefox() 
... 
el = driver.find_element_by_id("-spel-nba") 
actions.move_to_element(el) 
actions.sleep(.1) 
actions.click() 
actions.perform() 

ich diese Störung erhalte.

ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with 

nach Saifur Ich habe gerade versucht wartet mit dem gleichen Element nicht sichtbar Ausnahme:

wait = WebDriverWait(driver, 10) 
wait.until(EC.presence_of_element_located((By.XPATH, "//input[contains(@id,'spsel')][@value='nba']"))).click() 
+0

http://selenium-python.readthedocs.org/en/latest/waits.html –

+0

Danke, ich warte einfach ausprobiert und es timed out – user4450305

+0

was ist die URL? –

Antwort

34

warten Wenn Sie auf der Webseite des Quelle, Sie werden verstehen, dass fast alle der SELECT, DIV Elemente sind faked und erstellt von Jav aScript, deshalb kann webdriver nicht SIEHE SIE.

Es gibt eine Problemumgehung aber von ActionChains mit Ihrem Entwickler-Konsole zu öffnen, und injizieren eine künstlichen Klicken Sie auf das gewünschte Element, das in der Tat, die ist Label- Auslösen der NBA Daten werden geladen ... hier ein funktionierendes Beispiel:

from selenium import webdriver 
from selenium.webdriver.common import action_chains, keys 
import time 

driver = webdriver.Firefox() 
driver.get('Your URL here...') 
assert 'NBA' in driver.page_source 
action = action_chains.ActionChains(driver) 

# open up the developer console, mine on MAC, yours may be diff key combo 
action.send_keys(keys.Keys.COMMAND+keys.Keys.ALT+'i') 
action.perform() 
time.sleep(3) 
# this below ENTER is to rid of the above "i" 
action.send_keys(keys.Keys.ENTER) 
# inject the JavaScript... 
action.send_keys("document.querySelectorAll('label.boxed')[1].click()"+keys.Keys.ENTER) 
action.perform() 

Alternativ alle ActionChains Befehle zu ersetzen, können Sie einfach execute_script wie folgt ausführen:

driver.execute_script("document.querySelectorAll('label.boxed')[1].click()") 

Da gehen Sie, zumindest auf meine lokale Datei sowieso ... Hoffe das hilft!

enter image description here

+0

@ user4450305, kein Problem, und ich bin froh, zu helfen;) Dies ist eigentlich eine sehr heikle, ich ' Ich habe 10 Minuten auf den Browser Inspector versucht ... bevor ich die Seitenquelle angeschaut und herausgefunden habe, was passiert ist. +1 für deine Frage – Anzel

+0

@Anzel Ist "Action" Multi-Browser compitble?und kannst du bitte den Javascript Teil ein wenig erklären? nur für mein Verständnis – Saifur

+1

@Saifur, ja Aktion ist Multi-Browser-kompatibel, ich benutze dies normalerweise, um alle interaktiven Bewegungen zwischen Code und Browser zu sehen, es ist wie eine Kette von Aktionen, die Sie gerade selbst tun sehen. Das ** execute_script ** ist nur eine direktere Art, das Javascript direkt auszuführen. Und über das JavaScript, da die Daten auf der Website grundsätzlich von Javascript manipuliert werden und die Daten dynamisch füttern und das DOM aufbauen. webdriver wird sie nicht sehen, wenn sie zum Beispiel auf unsichtbar oder deaktiviert eingestellt sind. In diesem Fall möchten Sie das Skript INJECT, um die gewünschte Aktion passieren zu lassen – Anzel

1

Ich schlage vor, Sie verwenden xpath mit explicit

//input[contains(@id,'spsel')][@value='nba'] 
+0

gleicher Fehler: ElementNotVisibleException: Nachricht: Element ist momentan nicht sichtbar und darf daher nicht mit – user4450305

+1

@Saifur interagiert werden, normalerweise sollte es aber funktionieren Anlass, wenn Sie die Seitenquelle überprüfen, fast alle Elemente sind gefälscht/dynamisch von JavaScript erstellt, webdriver kann sie nicht sehen – Anzel

12

Was für mich gearbeitet wurde das Element nur zu finden, bevor die problematische (das heißt, kurz bevor es in Bezug auf die Tab-Reihenfolge), dann Tab auf diesem Element nennen.

from selenium.webdriver.common.keys import Keys 
elem = br.find_element_by_name("username") 
elem.send_keys(Keys.TAB) # tab over to not-visible element 

Danach war ich in der Lage, Aktionen an das Element zu senden.

+1

Danke, das ist bei weitem die einfachste Lösung – mdegges

1

wenn "Element ist nicht sichtbar" es dann VISIBLE

F. E. machen

>>> before is hidden top is outside of page 
<input type="file" style="position: absolute;top:-999999" name="file_u"> 


>>> after move top on in page area 
DRIVER.execute_script("document.getElementByName('file_u').style.top = 0;") 
time.sleep(1); # give some time to render 
DRIVER.find_element_by_name("file_u").send_keys("/tmp/img.png") 
0

Statt get_element_by_id() können Sie elem = browser.find_element_by_css_selector('#elemId') versuchen (gehen Sie zu dieser Webseite und das Element, das einen Rechtsklick und Copy CSS Selector, oder so ähnlich.) Das, was ich tat, und es funktioniert.Sie versuchen auch find_element_by_link_text(text), find_element_by_partial_link_text(text), find_element_by_tag_name(tagName_case_insensitive_here), find_element_by_name(name) usw. Etwas wird funktionieren. Nach der id ist die CSS Selector Ihre beste Wette.

0

Die tatsächliche Lösung dieses Threads funktionierte nicht für mich.

jedoch

dies tat:

EC.visibility_of_element_located

die WebDriverWait

WebDriverWait

von diesem Import:

element = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.XPATH, xpaths['your_xpath_path']))) 

der Trick zu verwenden ist

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.ui import WebDriverWait

Verwandte Themen