Alors je perds la tête ici. Je veux cliquer sur un bouton spécifique mais il y a une erreur que je ne comprends pas:

Traceback (most recent call last):
  File "C:\Users\leosc\PycharmProjects\ogameBot\guideline.py", line 22, in guideline
    if metalMineLVL() > (10):
  File "C:\Users\leosc\PycharmProjects\ogameBot\guideline.py", line 10, in <lambda>
    metalMineLVL = lambda: c.metalMine.checkLVL()
  File "C:\Users\leosc\PycharmProjects\ogameBot\classes.py", line 121, in checkLVL
    a = self.sparte()
  File "C:\Users\leosc\PycharmProjects\ogameBot\classes.py", line 54, in <lambda>
    (By.XPATH, ('//*[contains(text(),\'{}\')]').format(sparte))))
  File "C:\Users\leosc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until
    value = method(self._driver)
  File "C:\Users\leosc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in __call__
    return _find_element(driver, self.locator)
  File "C:\Users\leosc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 415, in _find_element
    raise e
  File "C:\Users\leosc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element
    return driver.find_element(*by)
  File "C:\Users\leosc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\Users\leosc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\leosc\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchWindowException: Message: no such window: target window already closed
from unknown error: web view not found
  (Session info: chrome=72.0.3626.121)
  (Driver info: chromedriver=2.46.628402 (536cd7adbad73a3783fdc2cab92ab2ba7ec361e1),platform=Windows NT 10.0.17134 x86_64)

Voici le code:

self.sparte = lambda: wait.until(                   
    EC.presence_of_element_located(
    (By.XPATH, ('//*[contains(text(),\'{}\')]').format(sparte))))
self.LVL = lambda: int(
    wait.until(EC.presence_of_element_located((By.XPATH, ('//* 
    [@ref=\'' + str(ref) + '\']/span/span')))).text)

def checkLVL(self):

    time.sleep(1)
    self.sparte().click()
    time.sleep(1)
    return self.LVL()


    metalMineLVL = lambda: c.metalMine.checkLVL()
    roboFabLVL = lambda: c.roboFab.checkLVL()

    try:
        if metalMineLVL() > (10):
            if roboFabLVL() <(5):
                c.roboFab.build()
    except:
        pass

Lorsque j'active le débogueur, je vois que tout est traité jusqu'à ce qu'il arrive à

self.sparte = lambda: wait.until(                   
    EC.presence_of_element_located(
    (By.XPATH, ('//*[contains(text(),\'{}\')]').format(sparte))))

Puis il passe à la partie exception. MAIS j'utilise cette ligne de code dans le reste du programme tout le temps et généralement cela fonctionne parfaitement. Qu'est-ce que je fais mal? Merci d'avance!!

0
Leo blubla 10 mars 2019 à 21:42

2 réponses

Meilleure réponse

Je ne sais pas pourquoi vous obtenez cette erreur. Ma meilleure supposition est que c'est à cause de conflits d'espace de noms mais je ne suis pas sûr. Voici le code que j'utilise pour cliquer sur les choses:

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

def clickElement(driver, XP):
    WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, XP)))
    driver.find_element_by_xpath(XP).click()

Exemple:

clickElement(driver, '/html/body/div[3]/div/a[1]')

Consultez également PEP 498 pour le formatage des chaînes.

0
Florian Peters 10 mars 2019 à 21:43

J'ai maintenant découvert que le problème était que le programme ouvre 4 onglets supplémentaires puis ferme le premier. Normalement, je faisais ensuite:

newTabs = c.driver.window_handles
        for tab in newTabs:
            c.driver.switch_to.window(tab)

Pour que Selenium travaille sur les nouveaux onglets. Pourtant, en écrivant le nouveau code, j'ai oublié de le faire, alors Selenium pensait qu'il fonctionnait toujours sur l'onglet initial, qui était déjà fermé. Merci beaucoup quand même !!

0
Leo blubla 10 mars 2019 à 22:03