4 votes

Le script de Python s'exécute dans la console mais se trompe de script.

Je travaille sur un script pour tirer quelques informations d'un site que je dois me connecter pour utiliser. J'utilise Python 2.7.12 et Selenium 3.4.3.

#!/usr/bin/python
from selenium import webdriver
browser = webdriver.Firefox(firefox_binary='/usr/bin/firefox', executable_path="./geckodriver")

# Get to the login page
browser.get('https://example.com')
browser.find_element_by_link_text('Application').click()

# Login
browser.find_element_by_id('username').send_keys('notmyusername')
browser.find_element_by_id('password').send_keys('notmypassword')
browser.find_element_by_css_selector('.btn').click()

# Open the application
try:
    browser.find_element_by_id('ctl00_Banner1_ModuleList_ctl01_lnkModule').click()
except:
    print('failed')

#browser.stop()

Si je copie ce code et le colle dans la console python, il s'exécute parfaitement et me conduit à la page souhaitée. Cependant, lorsque j'exécute le script à partir du terminal (bash sur Linux Mint 18), il se trompe. Voici la sortie avec les déclarations try et catch supprimées :

Traceback (most recent call last):
  File "./housing.py", line 15, in <module>
    browser.find_element_by_id('ctl00_Banner1_ModuleList_ctl01_lnkModule').click()
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 289, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 791, in find_element
    'value': value})['value']
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="ctl00_Banner1_ModuleList_ctl01_lnkModule"]

Je ne sais même pas comment résoudre ce problème. Vous pouvez m'aider ?

Modifier

Voici un extrait du lien que j'essaie de sélectionner :

            <li>
                <a id="ctl00_Banner1_ModuleList_ctl00_lnkModule" class="should-show ui-should-show header-4" AutoSetting="false" data-role="button" href="javascript:__doPostBack(&#39;ctl00$Banner1$ModuleList$ctl00$lnkModule&#39;,&#39;&#39;)"><span>Link A</span></a>
                <noscript>
                    <input type="submit" name="ctl00$Banner1$ModuleList$ctl00$btnModule" value="Link A" id="ctl00_Banner1_ModuleList_ctl00_btnModule" class="header-4 button-as-link" />
                </noscript>
            </li>

            <li>
                <a id="ctl00_Banner1_ModuleList_ctl01_lnkModule" class="should-show ui-should-show" AutoSetting="false" data-role="button" href="javascript:__doPostBack(&#39;ctl00$Banner1$ModuleList$ctl01$lnkModule&#39;,&#39;&#39;)"><span>Link B</span></a>
                <noscript>
                    <input type="submit" name="ctl00$Banner1$ModuleList$ctl01$btnModule" value="Link B" id="ctl00_Banner1_ModuleList_ctl01_btnModule" class="button-as-link" />
                </noscript>
            </li>

            <li>
                <a id="ctl00_Banner1_ModuleList_ctl02_lnkModule" class="should-show ui-should-show" AutoSetting="false" data-role="button" href="javascript:__doPostBack(&#39;ctl00$Banner1$ModuleList$ctl02$lnkModule&#39;,&#39;&#39;)"><span>Link C</span></a>
                <noscript>
                    <input type="submit" name="ctl00$Banner1$ModuleList$ctl02$btnModule" value="Link C" id="ctl00_Banner1_ModuleList_ctl02_btnModule" class="button-as-link" />
                </noscript>
            </li>

</ul>

2voto

Thundzz Points 480

Ce qui se passe très probablement est que lorsque vous exécutez le script à partir de bash, le script s'exécute trop rapidement et le get_by_id est lancée avant que le navigateur ait fini de charger la page, ce qui entraîne cette erreur.

Comme l'a suggéré @murali-selenium, vous devriez probablement ajouter un temps d'attente avant de commencer à chercher des éléments dans le document.

Cela peut être réalisé de cette façon :

#!/usr/bin/python
from selenium import webdriver
import time

wait_time_sec = 1

browser = webdriver.Firefox(firefox_binary='/usr/bin/firefox', executable_path="./geckodriver")

# Get to the login page
browser.get('https://example.com')
time.sleep(wait_time_sec)
browser.find_element_by_link_text('Application').click()
time.sleep(wait_time_sec)

# Login
browser.find_element_by_id('username').send_keys('notmyusername')
browser.find_element_by_id('password').send_keys('notmypassword')
browser.find_element_by_css_selector('.btn').click()
time.sleep(wait_time_sec)

# Open the application
try:
    browser.find_element_by_id('ctl00_Banner1_ModuleList_ctl01_lnkModule').click()
except:
    print('failed')

#browser.stop()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X