J'essaye d'appuyer sur un bouton avec du sélénium en python. Je ne parviens pas à le localiser avec xpath ou css selector.
Pour le reste du script, j'utilise xpath et cela fonctionne bien, mais xpath de ce bouton semble être relatif à chaque fois que je l'ouvre. Par conséquent, j'ai essayé d'accéder est avec le sélecteur css.
L'élément auquel j'essaie d'accéder ressemble à ceci:
# This opens up the window in which to press the next button (works fine) button = driver.find_element_by_xpath('//*[@id="content"]/div[1]/section/div[2]/button') button.click() driver.implicitly_wait(15) time.sleep(5) # This is what doesn't work driver.find_element_by_class_name('button.btn.btn-primary-pull-right').click()
Le sélecteur css d'inspect dans chrome:
#\35 d167939-adc2-0901-34ea-406e6c26e1ab > div.modal-footer > div > button.btn.btn-primary.pull-right
driver.find_element_by_class_name ('# \ 35 d167939-adc2-0901-34ea-406e6c26e1ab.div.modal-footer.div.button.btn.btn-primary.pull-rightdiv.button.btn .btn-primary-pull-right '). click ()
driver.find_element_by_class_name('div.button.btn.btn-primary-pull-right').click()
driver.find_element_by_class_name('button.btn.btn-primary-pull-right').click()
driver.find_element_by_class_name('btn.btn-primary-pull-right').click()
driver.find_element_by_class_name('btn-primary-pull-right').click()
J'ai également essayé une minuterie de mise en veille.
Le bouton se trouve dans une fenêtre qui s'ouvre lorsque vous appuyez sur le bouton précédent, avec l'arrière-plan grisé, si cela vous aide. Image .
<button type="button" data-dismiss="modal" class="btn btn-primary pull-right">Opret AnnonceAgent</button>
J'attends que le programme presse le bouton et ce n'est pas le cas, il reste juste là.
3 Réponses :
class_name
reçoit une classe en tant que paramètre, mais vous utilisez la syntaxe css
comme localisateur.
Avec css_selector
XXX
Ce qui signifie balise avec 2 classes,
btn
et btn-primary-pull-right
Avec class_name
driver.find_element_by_class_name('btn-primary-pull-right')
@BertilJohannesIpsen Veuillez préciser. Qu'est-il exactement arrivé?
Bon, désolé! J'ai eu la même exception, le NoSuchElementException: Message: aucun élément de ce type: Impossible de localiser l'élément: {"method": "class name", "selector": "btn-primary-pull-right"} code >, et de même pour l'autre.
@BertilJohannesIpsen Essayez d'ajouter attente explicite . Vous devez également vérifier si le bouton est dans
merci, j'ai déjà essayé les deux ( time.sleep (t)
ainsi que dans le fil @KajulKundu)
Ma supposition était juste.Il y avait un iframe
qui s'arrêtait pour accéder à l'élément.Vous devez d'abord passer à iframe
pour accéder au bouton code > élément.Essayez maintenant avec le code suivant.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
#WebDriverWait(driver,20).until(expected_conditions.frame_to_be_available_and_switch_to_it((By.XPATH,'//iframe[starts-with(@id,"rdr_")]')))
WebDriverWait(driver,20).until(expected_conditions.frame_to_be_available_and_switch_to_it((By.XPATH,'//iframe[@id="qualaroo_dnt_frame"]')))
driver.find_element_by_css_selector('button.btn.btn-primary').click()
Êtes-vous capable de faire ce mot? Lorsque je l'implémente, j'obtiens une TimeoutException
.
bien faire une chose essayez ceci WebDriverWait (pilote, 20) .until (expected_conditions.frame_to_ be_available_and_swi tch_to_it ((By.XPATH, '// iframe [@ id = "quala roo_dnt_frame"]')) ) driver.find_element_by_css_selector ('button.btn.btn-primary') .click ()
Hm, pour celui-là, je reçois à nouveau une NoSuchElementException
pour le bouton.
pouvez-vous faire une chose au lieu de l'image pouvez-vous partager le html afin que je puisse copier le code HTML entier et tester sur mon ordinateur portable ce qui ne va pas?
Est-ce le même html que vous recherchez? Je ne trouve pas d'iframe ici quand je vois le html mais lorsque vous avez posté l'image, il montrait l'iframe?
Ah, désolé, c'est la source de la page, mais les éléments sur lesquels nous travaillons sont rendus après le javascript. Y a-t-il un moyen pour moi d'obtenir le html avec du sélénium afin que je puisse vous envoyer?
Une fois que vous atteignez la page, appuyez sur F12 sur chrome et obtenez le html
L'élément souhaité se trouve dans une boîte de dialogue modale , vous devez donc induire WebDriverWait pour que l'élément souhaité soit cliquable et vous pouvez utilisez l'une des Stratégies de localisation :
Utilisation de CSS_SELECTOR
:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
Utilisation de XPATH
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-primary pull-right' and @data-dismiss='modal'][text()='Opret AnnonceAgent']"))).click()
Remarque : vous devez ajouter les importations suivantes:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.btn-primary.pull-right[data-dismiss='modal']"))).click()
Essayez cela pour voir si cela fonctionne
driver.find_element_by_css_selector ('button.btn.btn-primary. pull-right'). Click ()
Merci, mais ne fonctionne toujours pas. J'obtiens
AttributeError: l'objet 'list' n'a pas d'attribut 'click'
, en supposant que c'est un élément - était-ce intentionnel?c'était typo.try encore
driver.find_element_by_css_selector ('button.btn.btn-primary. pull-right'). click ()
Ne fonctionne pas, j'obtiens
NoSuchElementException
Pouvez-vous vérifier s'il y a un cadre qui bloque pour localiser le bouton?
S'il s'agit d'un lien public, pouvez-vous partager l'URL pour vérifier ce qui ne va pas?
Ce n'est pas le cas, car vous devez être connecté. Vérifiez-le cependant - vous pouvez voir comment il se trouve dans une autre div, est-ce que je devrais en tenir compte? Image . Edit: j'ai mis en évidence le bouton et la chose qu'il contient.