Le sélénium Élément n'est pas visible exception
J'ai été chargé de la rédaction d'un analyseur de cliquer sur un bouton sur un site web et je rencontre des problèmes de cliquer sur un seul des boutons. Le code suivant fonctionne sur tous les boutons sauf un.
Voici le code html:
http://pastebin.com/6dLF5ru8
voici le code source html:
http://pastebin.com/XhsedGLb
code python:
driver = webdriver.Firefox()
...
el = driver.find_element_by_id("-spel-nba")
actions.move_to_element(el)
actions.sleep(.1)
actions.click()
actions.perform()
J'obtiens cette erreur.
ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
comme par Saifur j'ai juste essayé de t'attend avec le même élément n'est pas visible exception:
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.XPATH, "//input[contains(@id,'spsel')][@value='nba']"))).click()
- selenium-python.readthedocs.org/en/latest/waits.html
- Merci, j'ai juste essayé d'attendre et il a expiré
- quelle est l'url?
- Pas de correspondance nom de la classe dans le code html que vous avez fournis. Vous utilisez le sélecteur de mal
- Saifur, j'ai juste essayé de modifier. Il est de retour à l'endroit où il était quand j'ai posté.
- Essayez d'utiliser
findelements
avec le même sélecteur et de voir combien d'éléments il retourne. Je me demande s'il y a des éléments cachés avec le même sélecteur. C'est un problème très commun - Padraic, c'est pour un client derrière un accès privé.
- len(pilote.find_elements_by_id("-spsel-nba")) est 1
- Pouvez-vous essayer avec le xpath j'ai fourni?
- comme ceci: pilote.find_element_by_xpath("//input[contains(@id,'spsel')][@value='nba']")
- utilisation
explcit
attendre avant cela commewait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//input[contains(@id,'spsel')][@value='nba']")))
- tout
iframe
sur cette page? - Non, iframe sur la page.
- est-il du délai @
EC
? et peut demander la vous la raison de la non-utilisationclick()
? - non, c'est pas du timing sur CE. quand je clique sur il jette la même exception. attendre.jusqu'à ce que(CE.presence_of_element_located((Par.XPATH "//input[contains(@id,'spsel')][@value='nba']"))).cliquez sur()
- Dernier essai avant que j'abandonne 🙂
driver = webdriver.Firefox() ... wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='sport-selectors']//input[contains(@id,'spsel')][@value='nba']"))).click() driver.find_element_by_xpath("//div[@class='sport-selectors']//input[contains(@id,'spsel')][@value='nba']").click()
- Même exception. Eh bien, le client et son foutu demandes!
- Est-il possible d'ajouter des captures d'écran?
- Permettez-moi de revenir vers le client et à lui dire. Vous ne savez pas si il veut le sortir de la.
- J'ai résolu ce problème. Si vous regardez le source de la page, presque tous les éléments sont créés dynamiquement en JavaScript, qui webdriver ne pas les reconnaître. Une solution de contournement consiste à injecter certains JavaScripts pour effectuer une artificielle cliquez sur 😉
Vous devez vous connecter pour publier un commentaire.
Si vous regardez le source de la page, vous allez comprendre que presque tous les
SELECT
,DIV
éléments sontfaked
et créé à partir de JavaScript, c'est pourquoi webdriver ne peut pas VOIR eux.Il y a une solution de contournement en utilisant
ActionChains
pour ouvrir votre développeur de la console, et injecter un artificielle CLIQUEZ sur l'élément souhaité, ce qui en fait, est le Étiquette le déclenchement de la NBA chargement des données... en voici un exemple:Sinon à remplacer tous les
ActionChains
commandes, vous pouvez simplement exécuterexecute_script
comme ceci:Là vous allez, au moins sur mon fichier local de toute façon... Espérons que cette aide!
action
multi-navigateur compitble? et, pouvez-vous expliquer la partie javascript un peu? juste pour ma compréhensiondriver.execute_script("javscript code here...")
var elem = document.getElementsByClassName("MyClass")[1]; elem.click().perform();
Merci pour votre aide!Ce qui a fonctionné pour moi a été de trouver l'élément juste avant la problématique (qui est, juste avant qu'il n'en termes d'ordre de tabulation), puis Onglet appel sur cet élément.
Après avoir fait cela, j'ai été en mesure d'envoyer des actions à l'élément.
Je vous suggère d'utiliser
xpath
avecexplicit
attendreDe la solution réelle de ce fil ne fonctionne pas pour moi.
cependant,
il n' :
l'astuce est d'utiliser :
la WebDriverWait
de cette importation :
si "l'Élément n'est pas actuellement visible", puis le faire VISIBLE
f.e.
Au lieu de
get_element_by_id()
vous pouvez essayerelem = browser.find_element_by_css_selector('#elemId')
(aller à cette page web et l'élément, cliquez droit etCopy CSS Selector
, ou quelque chose comme ça). C'est ce que j'ai fait et ça fonctionne. Vous aussi essayezfind_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)
etc. Quelque chose fonctionne. Après laid
laCSS Selector
est votre meilleur pari.J'ai fini à l'aide de @twasbrillig de la solution, mais au lieu de trouver l'élément précédent, et l'envoi d'un ONGLET de pression de touche, je trouve l'élément souhaité, envoyer un ONGLET de pression de touche avec cet élément, puis une MAJ + TAB keypress pour le pilote:
J'ai essayé d'utiliser les autres méthodes, mais en fin de compte trouvé que la façon la plus simple est de simplement essayer et cliquez sur le bouton, et la capture de l'erreur. Cela me permet d'effectuer d'autres actions basées sur si cela a fonctionné (True) ou non (False).
La façon dont j'ai résolu ce problème en
python
était: