web-dev-qa-db-fra.com

Comment utilisez-vous EC.PRESENCE_OF_ELEMENT_LOCATED (((ID, "MYDynamICElement")) sauf pour spécifier la classe non ID

J'essaie d'utiliser Python au Web gratter un site Web qui charge de manière html de manière dynamique à l'aide de fichiers JavaScript incorporés qui rendent les données comme une réponse dans le HTML. Par conséquent, si j'utilise Beautifulsoup seul, je ne sera pas en mesure de récupérer ces données dont j'ai besoin car mon programme le fera gratter avant que le JavaScript charge les données. En raison de cela, j'intervene la bibliothèque de sélénium dans mon code, pour que mon programme soit attendu jusqu'à ce qu'un certain élément soit trouvé avant Il gratte le site Web.

Je l'avais fait à l'origine:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.ID, "tabla_evolucion")))

Mais je veux spécifier une classe plutôt en faisant quelque chose comme:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))  

Voici le reste de mon code:

driver_path = 'C:/webDrivers/chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.header_overrides = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}
url = "myurlthatIamscraping.com" 
response = driver.get(url)
html = driver.page_source
characters = len(html)
element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))

print(html)
print(characters)
time.sleep(10)
driver.quit()

Cela ne fonctionne pas pour moi et je ne trouve pas la syntaxe droite nulle part.

3
Rishi Vadaga

C'est dans les docs .

Ensemble de stratégies de localisateur pris en charge.
class_name = 'Nom de la classe'
[.____] CSS_SLORT = 'Sélecteur CSS'
Id = 'id'
link_text = 'Texte de liaison'
Nom = 'nom'
partielle_link_text = 'Texte partiel de lien "
[.____] Tag_Name = 'Nom de la balise'
Xpath = 'xpath'

Remarque: ce que vous avez dans votre code n'est pas une classe, c'est deux classes. Cela ne fonctionnera pas si vous utilisez By.CLASS_NAME() car il n'attend que une seule classe. Ce que vous voulez à la place est un sélecteur CSS

EC.presence_of_element_located((By.CSS_SELECTOR, ".ng-binding.ng-scope")))

Dans la syntaxe sélecteur CSS, un . indique une classe. Voir The W3C Docs Pour plus d'informations sur la syntaxe du sélecteur CSS.

0
JeffC