web-dev-qa-db-fra.com

python Webscraping Selenium "NoSuchElementException" non reconnu

Parfois, sur une page, je vais chercher un élément qui peut ou non être là. Je voulais essayer/attraper ce cas avec un NoSuchElementException, que Selenium lançait lorsque certains éléments HTML n'existaient pas. Exception d'origine:

NoSuchElementException: Message: u'Unable to locate element: {"method":"css selector","selector":"#one"}' ; Stacktrace: 
    at FirefoxDriver.prototype.findElementInternal_ (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/[email protected]/components/driver_component.js:8899)
    at FirefoxDriver.prototype.findChildElement (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/[email protected]/components/driver_component.js:8911)
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/[email protected]/components/command_processor.js:10840)
    at DelayedCommand.prototype.executeInternal_ (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/[email protected]/components/command_processor.js:10845)
    at DelayedCommand.prototype.execute/< (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/[email protected]/components/command_processor.js:10787) 

Ironiquement, cela ne me laissera pas attraper cette exception qu'il lançait auparavant? Code ici:

elt = driver.find_element_by_css_selector('.information')
try:
    dat1 = elt.find_element_by_css_selector('#one').text
    dat2 = elt.find_elements_by_css_selector('#two')[1].text
    text = dat1 + dat2
except NoSuchElementException:
    text = elt.find_element_by_css_selector('#all').text
    item.set_description(text)

Erreur ici:

NameError: name 'NoSuchElementException' is not defined

La recherche sur Google/la documentation n'a rien donné ... et il me semble étrange que Selenium réussisse à lancer une exception mais ne puisse pas l'attraper.

41
lollercoaster

Essayez soit elt.NoSuchElementException ou driver.NoSuchElementException tel qu'il est probablement défini dans le cadre de l'un d'eux. Sinon, vous devrez peut-être utiliser from Selenium import NoSuchElementException pour le mettre en perspective.

Mieux encore: from Selenium.common.exceptions import NoSuchElementException

102
Steve Barnes

Vous devez utiliser from Selenium.common.exceptions import * Puis écrire except NoSuchElementException

1
Aidin