Я исправил предыдущую проблему с sys.argv (зависит от того, как файл .cmd вызывает скрипт).
Теперь я застрял с другой проблемой:
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
IЯ много читал об этом, но я все еще не понимаю, как с этим справиться.
Мой код довольно прост:
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)?
Спасибо за вашу помощь!; -)
EDIT
Вот мой код.
У меня есть файл настроек "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)))