2016-11-11 2 views
0

J'utilise BeautifulSoup avec Selenium. J'ouvre une page Web avec Selenium avec une extension chrome. Lorsque je clique manuellement droit et « inspecter » sur un bouton, je peux voir le htmlPourquoi le sélénium ne peut-il pas trouver un bouton dans une extension Chrome (Python)

<button type="button" class="btn btn-primary" style="width: 150px;">Find Email</button>

Si je clique droit et « source de la page vue » ce html ne figure pas dans le code source que je présume est pourquoi le sélénium ne peut pas le trouver. Il semble être piloté par json et javascript mais je ne suis pas sûr sur le fonctionnement complet. Quelqu'un peut-il suggérer comment j'utilise le sélénium dans cet environnement.

Voilà comment j'ouvre le navigateur:

options = webdriver.ChromeOptions() 
    options.add_argument("--start-maximized") 
    options.add_extension('/home/henry/Downloads/candidate.ai-get-email,-salary,-social-link_v0.3.6.crx') 
    with closing(Chrome(chrome_options=options)) as driver: 
     driver.get(url) 

Voilà comment je suis en train d'obtenir le bouton:

button = driver.find_element_by_css_selector('btn') 
    button.click() 

Voici l'erreur que je me donne:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"btn"} 
+2

Votre sélecteur n'est pas valide. Un valide serait: 'button.btn' –

+0

Même erreur:' selenium.common.exceptions.NoSuchElementException: Message: pas un tel élément: Impossible de localiser l'élément: {"méthode": "css selector", "selector": " button.btn "}' – HenryM

Répondre

0

Comme btn n'est pas un élément, mais un nom class, vous ne pouvez pas l'utiliser sur votre chemin. Certains de nom de classe façons possibles que vous pouvez utiliser sont:

button = driver.find_element_by_css_selector('.btn') 
button = driver.find_element_by_css_selector('button.btn') 
button = driver.find_element_by_css_selector('button.btn.btn-primary') 
button = driver.find_element_by_xpath('//button[@class="btn btn-primary"]') 
... 

Aussi, vous pouvez trouver yor bouton par son lien texte:

button = driver.find_element_by_xpath('//button[.="Find Email"]') 
button = driver.find_element_by_link_text("Find Email") 

Comme le bouton situé à l'intérieur d'un iframe, utilisez le code suivant:

from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver.switch_to_frame("bconsole") 
button = WebDriverWait(driver, 2).until(EC.element_to_be_clickable((By.LINK_TEXT, "Find Email"))) 
... 
# Perform required actions inside iframe 
driver.switch_to_default_content() 
+0

Vous semblez savoir exactement ce que j'essaie de faire mais en utilisant 'button = driver.find_element_by_css_selector ('bouton [. =" Find Email "]')' Je reçois le 'selenium.common 'suivant. exceptions.InvalidSelectorException: Message: sélecteur invalide: Un sélecteur invalide ou illégal a été spécifié' – HenryM

+0

Et 'button = driver.find_element_by_css_selector ('bouton [class =" btn btn-primary "]')' donne 'selenium.common.exceptions.NoSuchElementException : Message: aucun élément de ce type: Impossible de localiser l'élément: {"méthode": "sélecteur css", "sélecteur": "bouton [class =" btn btn-primary "]"} ' – HenryM

+0

@HenryM, oh, désolé,' css selector' semble ne pas être aussi flexible que XPath. S'il vous plaît, vérifiez la réponse mise à jour – Andersson