2014-03-30 41 views
8

我试图自动化逐帧加载的网页上的进程。我试图设置一个try-except循环,只有在元素被确认存在后才会执行循环。这是我的代码已经设置了:Python的硒Webdriver - 尝试除了循环

from selenium.common.exceptions import NoSuchElementException 

while True: 
    try: 
     link = driver.find_element_by_xpath(linkAddress) 
    except NoSuchElementException: 
     time.sleep(2) 

上面的代码无法正常工作,而下面的天真方法确实:

time.sleep(2) 
link = driver.find_element_by_xpath(linkAddress) 

有什么在上面尝试 - 除了循环不见了?我尝试了各种组合,包括在try之前使用time.sleep(),而不是在except之后。

感谢

+0

如果找不到元素,您当前的代码只会睡觉。 – 2014-03-30 07:55:46

+0

是的,这个想法是在再次尝试之前等待2秒钟,除非执行过程中出现错误。 – user3294195

+0

我想我对“元素确认后执行”的措辞感到困惑。我以前的评论是一个错误。 – 2014-03-30 07:58:57

回答

19

您的特定问题的答案是:

from selenium.common.exceptions import NoSuchElementException 

link = None 
while not link: 
    try: 
     link = driver.find_element_by_xpath(linkAddress) 
    except NoSuchElementException: 
     time.sleep(2) 

然而,有一种更好的方式来等待出现在页面上的元素:waits

+0

这完美...非常感谢!似乎错误与迭代背后的逻辑有关。 – user3294195

1

另一种方式可能是。

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

try: 
    element = WebDriverWait(driver, 2).until(
      EC.presence_of_element_located((By.XPATH, linkAddress)) 
    ) 
except TimeoutException as ex: 
      print ex.message 

在WebDriverWait调用中,把驱动变量和秒等待。

+0

这对我不起作用。错误消息:'NameError:全局名称'TimeoutException'未定义'。我认为在这个例子中,你至少需要'导入selenium',然后用'替换第5行,除了selenium.common.exceptions.TimeoutException,例如:'。 – altabq

+0

是的,你需要。来自selenium.common.exceptions import TimeoutException – Charls

+0

听起来像是一个值得您编辑的答案 – altabq