Где я ошибаюсь с моим явным ожиданием | Ожидаемые условия | Синтаксис wait.until?

Я исправил мою предыдущую проблему с sys.argv (зависит от того, как файл.cmd вызывает скрипт).

Теперь я застрял с другой проблемой:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

Я много читал об этом, но я все еще не понимаю, как с этим бороться.

Мой код довольно прост:

while True:
    price = float(driver.find_elements_by_xpath("//td[@class='col-prix']")[0].text.strip()[:-1].replace(",","."))
    if a <= price <= b: break
    driver.find_elements_by_xpath("//button")[0].click()

и иногда я получаю:

Traceback (most recent call last):
  File "script.py", line 51, in <module>
    driver.find_elements_by_xpath("//button")[0].click()

(...)

File "C:\Python\Python37-32\lib\site-packages\selenium-3.141.0-py3.7.egg\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

и иногда:

Traceback (most recent call last):
  File "script.py", line 49, in <module>
    price = float(driver.find_elements_by_xpath("//td[@class='col-prix']")[0].text.strip()[:-1].replace(",","."))

(...)

  File "C:\Python\Python37-32\lib\site-packages\selenium-3.141.0-py3.7.egg\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

Поэтому мне было интересно проверить, присутствуют ли оба (видимые???).

Я попытался реализовать простое:

wait = WebDriverWait(driver, 60)
element = wait.until(EC.presence_of_element_located((By.XPATH,"//button")))

а также

wait = WebDriverWait(driver, 60)
element = wait.until(EC.presence_of_element_located((By.XPATH,"//td[@class='col-prix']")))

но я все еще получаю те же ошибки.

ВОПРОС № 1: я использую правильный синтаксис?

ВОПРОС № 2: может ли это быть связано с тем, что оба элемента должны иметь предикат [0] (и если да, как я могу указать предикат в sence_of_element_located)?

Спасибо за вашу помощь!;-)


РЕДАКТИРОВАТЬ

Вот мой код

У меня есть файл настроек "test.txt", который содержит только:

https://ticketplace.psg.fr/fr/recherche-place/668829,1,1:2:3:4:5:6:7:8:9:10:11:12:13:14:15,81,161

У меня есть файл.cmd, который содержит только:

start "test" "py" "test.py" "test.txt"

и у меня есть тестовый скрипт "test.py":

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as ui
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from time import sleep
import datetime
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException
import csv
import sys
from playsound import playsound
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(executable_path="chromedriver")
with open(str(sys.argv[1]), "r") as settings:
    for setting in settings:
        driver.get(setting.split(",")[0].strip())
        tickets=setting.split(",")[1]
        categories=setting.split(",")[2]
        minPrice=float(setting.split(",")[3].strip())
        maxPrice=float(setting.split(",")[4].strip())
        try:
            driver.find_element_by_css_selector(".accepte_cookie.bandeau_close").click()
            alert = driver.switch_to.alert
            alert.accept()
            sleep(1)
        except:
            pass
        try:
            driver.find_elements_by_xpath("//button")[0].click()
            driver.find_element_by_xpath("//li[@data-search-term="+tickets+"]").click()
            driver.find_elements_by_xpath("//button")[0].click()
            sleep(1)
            driver.find_elements_by_xpath("//button")[1].click()
            for categorieNumber in categories.split(':'):
                driver.find_element_by_xpath("//li[@data-search-term='cat. "+categorieNumber+"']").click()
            driver.find_elements_by_xpath("//button")[1].click()
            sleep(1)
        except:
            continue
        while True:
            hint = float(driver.find_elements_by_xpath("//td[@class='col-prix']")[0].text.strip()[:-1].replace(",","."))
            if minPrice <= hint <= maxPrice: break
            driver.find_elements_by_xpath("//button")[0].click()
            driver.find_elements_by_xpath("//button")[0].click()
            sleep(1)
        cat = driver.find_elements_by_xpath("//td[@class='col-cat']")[0].text
        print(datetime.datetime.now().strftime("%H:%M")+" - "+tickets+" tix "+cat+" at "+str(int(hint)))

1 ответ

Вместо этого.

while True:
            hint = float(driver.find_elements_by_xpath("//td[@class='col-prix']")[0].text.strip()[:-1].replace(",","."))
            if minPrice <= hint <= maxPrice: break
            driver.find_elements_by_xpath("//button")[0].click()
            driver.find_elements_by_xpath("//button")[0].click()
            sleep(1)

Попробуйте приведенный ниже код.

while True:
price = float(driver.find_elements_by_xpath("//td[@class='col-prix']")[0].text.strip()[:-1].replace(",", "."))
print(price)
if a <= price <= b: break
element=WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.XPATH,"//button/span[text()='Tous les billets']")))
ActionChains(driver).move_to_element(element).perform()
driver.refresh()

Пожалуйста, дайте мне знать, если это работает.

Другие вопросы по тегам