По сути, я создаю небольшой скрипт для автоматизации некоторых основных вещей. Я использовал time.sleep(), чтобы программное обеспечение немного подождало, пока все не загрузится, но есть ли лучший способ сделать это?
Я хочу, чтобы скрипт ждал столько, сколько необходимо сам по себе, чтобы сделать все быстрее и чище.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
import time
from tkinter import *
def cs_update():
PATH = "C:\Program Files (x86)\chromedriver.exe"
options = Options()
options.headless = True
driver = webdriver.Chrome(PATH,options = options)
driver.set_window_size(1920,1080)
driver.minimize_window()
user_email = e.get()
user_password = e2.get()
driver.get("https://www.compraensanjuan.com")
time.sleep(3)
link = driver.find_element_by_link_text("Mi cuenta")
link.click()
time.sleep(3)
email = driver.find_element_by_name("email")
email.send_keys(user_email)
print("I sent the keys")
Вот как вы можете использовать ExplicitWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.get("https://www.compraensanjuan.com")
timeout = 20 # set seconds to wait until TimeOutException raised
link = WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.LINK_TEXT, "Mi cuenta")))
link.click()
email = WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.NAME, "email")))
Я сейчас читаю документацию и не будет ли неявное ожидание лучше в этом случае ??
Нет, неявное ожидание почти как time.sleep()
. Быстрое ожидание лучше почти во всех случаях, оно прекратит ожидание после того, как элемент будет найден. Например, ваш веб-сайт загружается за 3 секунды, вы можете написать свободное ожидание, чтобы найти его за 10 секунд. Если он загрузится через 3 секунды, отлично, он прекратит поиск и выполнит следующее действие. Если он по-прежнему не может найти через 10 секунд, он вызовет исключение. Но если вы это сделаете time.sleep(10)
, он всегда будет ждать 10 секунд, сколько времени потребуется для загрузки страницы, не имеет значения.
На самом деле, если вас беспокоит, что графический интерфейс не отвечает, единственный способ, который я мог придумать, — это использовать
threading
, возможно, сначала импортировать его. Я предполагаю, что вашcs_update()
вызывается с кнопки, а затем сделайте егоcommand=lambda:threading.Thread(target=cs_update).start
. Может работать. Или опубликуйте немного больше кода, чтобы мы могли лучше рассмотреть частьtkinter
.