it-swarm.com.de

Selenelement nicht sichtbare Ausnahme

Ich wurde mit dem Schreiben eines Parsers beauftragt, um auf eine Schaltfläche auf einer Website zu klicken, und ich habe Probleme, nur auf eine der Schaltflächen zu klicken. Der folgende Code funktioniert für jede Schaltfläche außer einer. 

Hier ist das HTML: http://Pastebin.com/6dLF5ru8

hier ist die Quell-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 bekomme diesen Fehler.

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

nach Saifur habe ich gerade versucht, mit dem gleichen Element nicht sichtbare Ausnahme zu warten:

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

Wenn Sie auf der Seite Quelle anschauen, werden Sie verstehen, dass fast alle theSELECT, DIV Elemente sind faked und von JavaScript erstellt, deshalb WebDriver nicht kann _ _ siehe sie.

Es gibt jedoch eine Problemumgehung, indem Sie mit ActionChains Ihre Entwicklerkonsole öffnen und einen künstlichen CLICK auf das gewünschte Element einfügen. Dabei handelt es sich tatsächlich um das Label, das das Laden von NBA - Daten auslöst ... hier ein Arbeitsbeispiel:

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 zum Ersetzen aller ActionChains-Befehle können Sie execute_script einfach wie folgt ausführen:

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

Da gehst du zumindest auf meine lokale Datei ... Hoffe das hilft!

enter image description here

40
Anzel

Was für mich funktionierte, war, das Element kurz vor dem problematischen Element zu finden (d. H. Kurz davor, was die Tabulatorreihenfolge angeht) und dann Tab für dieses Element aufzurufen.

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 konnte ich Aktionen an das Element senden.

15
twasbrillig

Die eigentliche Lösung dieses Threads hat für mich nicht funktioniert.

jedoch,

dieser tat:

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

der Trick ist zu verwenden: 

EC.visibility_of_element_located

der WebDriverWait 

WebDriverWait

von diesem import: 

von Selenium.webdriver.support: Erwartete_Zustände als EC importieren

von Selenium.webdriver.support.ui importieren Sie WebDriverWait

3
Tom

Ich schlage vor, dass Sie xpath mit explicit wait verwenden

//input[contains(@id,'spsel')][@value='nba']
3
Saifur

wenn "Element ist momentan nicht sichtbar", dann machen Sie esSICHTBAR

f.e.

>>> 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")
1
Andrei.Danciuc

Ich habe am Ende die Lösung von @ twasbrillig verwendet, aber anstatt das vorherige Element zu finden und einen TAB-Tastendruck zu senden, finde ich das gewünschte Element, sende einen TAB-Tastendruck mit diesem Element und dann eine UMSCHALT + TAB-Taste an den Treiber:

from Selenium import webdriver
from Selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()  
el = driver.find_element_by_id("-spel-nba")
el.send_keys(Keys.TAB)
webdriver.ActionChains(driver).key_down(Keys.SHIFT).send_keys(Keys.TAB).key_up(Keys.SHIFT)
0
bbobbo

Ich habe versucht, die anderen Methoden zu verwenden, aber am Ende stellte sich heraus, dass der einfachste Weg war, einfach auf die Schaltfläche zu klicken und den Fehler abzufangen. Dadurch kann ich andere Aktionen ausführen, je nachdem, ob es funktioniert (True) oder nicht (False).

def click_button(html_object):
 try:
  html_object.click()
 except:
  return False #most likely because it is NotVisible object and can be ignored
 return True

...
...
click_button(actions)
0
Guest

Die Art und Weise, wie ich das in python gelöst habe, war:

try:
    # the element you want to scroll to
    element = driver.find_element_by_id("some_id") 
    ActionChains(driver).move_to_element(element).perform()
    element.send_keys(Keys.TAB).key_up(Keys.SHIFT)
    #element.click()
except Exception as e:
    print(e)
0
Pedro Lobito

Anstelle von get_element_by_id() können Sie elem = browser.find_element_by_css_selector('#elemId') versuchen (gehen Sie zu dieser Webseite und dem Element, klicken Sie mit der rechten Maustaste darauf und Copy CSS Selector oder so ähnlich.) Dies ist, was ich getan habe 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 id ist der CSS Selector Ihre beste Wette.

0
Nik-Lz