Yapmaya çalıştığım şey ve çoğu zaman başarılı olduğum şey: Temelde bir web sitesinde oturum açıp bir sınıfın kaynağında olmasını bekliyorum. sonra kaynak kodunu işleyin.Selenium rastgele zaman aşımı istisnaları, herhangi bir mesaj olmadan
istisna alıyorum:
from selenium import webdriver
import contextlib
from selenium.webdriver.common.keys import Keys
import selenium.webdriver.support.ui as ui
from selenium.webdriver.support.wait import WebDriverWait
with contextlib.closing(webdriver.PhantomJS('phantomjs')) as browser:
browser.get('mywebsite')
login_form = browser.find_element_by_id('login-form')
email = browser.find_element_by_name('login')
password = browser.find_element_by_name('password')
email.send_keys(login)
password.send_keys(password)
password.send_keys(Keys.RETURN)
ui.WebDriverWait(browser, 10).until(lambda browser: browser.find_elements_by_class_name("the-class-i-want"))
Ben de bu çalıştı:
wait_count = 0
while wait_count < 6:
print wait_count
ui.WebDriverWait(browser, 10).until(lambda browser: browser.find_elements_by_class_name("the-class-i-want"))
if browser.find_elements_by_class_name("the-class-i-want"):
break
wait_count += 1
Aynı durum almak İşte
Traceback (most recent call last):
File "foo.py", line 495, in <module>
report(login, password)
File "foo.py", line 430, in report
data = bar(login, password)
File "foo.py", line 113, in
ui.WebDriverWait(browser, 10).until(lambda browser: browser.find_elements_by_class_name("the-class-i-want"))
File "/Library/Python/2.7/site-packages/selenium/webdriver/support/wait.py", line 71, in until
raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message: ''
kodudur.
Şu anda bu çalışıyorum: Ben hala onu test ediyorum, başarısız noktaya yok
wait_count = 0
while wait_count < 6:
try:
ui.WebDriverWait(browser, 10).until(lambda browser: browser.find_elements_by_class_name("the-class-i-want"))
if browser.find_elements_by_class_name("the-class-i-want"):
break
except:
wait_count += 1
continue
.
Üzgünüz, bu çok uzun. Ama bu rasgele zaman aşımlarına pythonic ve temiz bir çözüm bulmak istiyorum.
Ayrıca yardımcı olabilecek başka bir bilgi: işlemin imzalanması bazen çok uzun, ancak birkaç dakika beklese bile istisna atar.
from selenium import webdriver
import contextlib
from selenium.webdriver.common.keys import Keys
import selenium.webdriver.support.ui as ui
from selenium.webdriver.support.wait import WebDriverWait
def waiter(browser):
elements = browser.find_elements_by_class_name('the-class-i-want')
if len(elements) != 0:
return elements
return False
with contextlib.closing(webdriver.PhantomJS('phantomjs')) as browser:
browser.get('mywebsite')
login_form = browser.find_element_by_id('login-form')
email = browser.find_element_by_name('login')
password = browser.find_element_by_name('password')
email.send_keys(login)
password.send_keys(password)
password.send_keys(Keys.RETURN)
ui.WebDriverWait(browser, 10).until(waiter)
Ve bu mükemmel çalışıyor:
Özel durumun tam izini gönderir misiniz? Ayrıca, belirttiğiniz koşulun tatmin olduğundan emin misiniz? (aksi halde, 10 saniyeden sonra zaman aşımına uğrayacaktır) – jadkik94
Post düzenlenmiş, üzgünüm – nnaelle
Başka bir WebDriver'ı kullanmaya çalıştığınızda, sayfada neler olduğunu görebiliyor musunuz? Belki de sadece beklemekte olduğunuz koşul karşılanmamaktadır. – jadkik94