强制selenium暂停并等待字段可用

时间:2014-02-24 21:43:40

标签: python selenium selenium-webdriver xlrd

下面是我的python脚本中的代码片段,它读取excel文件并将行中的单元格分配给变量,然后用于在浏览器中键入字段。它在大多数情况下都很有效。我想要做的是在浏览器加载页面后设置某种循环来执行以下操作:

按一些ID查找元素。如果失败,请等待5秒钟然后再试一次。如果成功继续使用脚本的其余部分。现在对我来说很容易,这是我第一次真正的尝试。我试图嵌套try / except语句,但这很快就变得非常混乱。

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
import xlrd

workbook = xlrd.open_workbook("my_excel_file.xlsx")
worksheet = workbook.sheet_by_name('Sheet1')
x = 0
for current_row in range(worksheet.nrows):
    try:
        cmt = worksheet.row(current_row)[2].value
        browser = webdriver.Firefox() # Get local session of firefox
        browser.get("http://www.somewebsite.com") # Load page
        time.sleep(5)
        #this timer is the issue, if the field takes 6 seconds to be ready, script fails
        comment = browser.find_element_by_id("slow_comment_box") # Find the comment box
        comment.send_keys(str(cmt) + Keys.RETURN)
        x += 1
    except:
        print ("Error on " + str(x))
        quit ()

有没有办法设置它以我上面说的方式行事?我知道selenium等待页面加载,但文本框不是正常的,并且似乎有自己的加载,旋转轮。

摘要和解决方案 答案如下。我愚蠢的东西有一些语法错误。 this page was extremely useful as well.

2 个答案:

答案 0 :(得分:9)

您想使用WebDriverWait

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

element = WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.Id, 'id')))

答案 1 :(得分:0)

在尝试了Erki M。的回复之后,我到这里了解了有关在Selenium等待的更多信息:

http://selenium-python.readthedocs.org/en/latest/waits.html

文章提到了另一种既简单又简单的方法:

from selenium import webdriver

browser = webdriver.Firefox() 
browser.implicitly_wait(30)
browser.get("http://www.somewebsite.com")

从您指定隐含等待时间开始,浏览器将耐心等待并轮询该网站以查看它是否可以找到您要查找的元素。这种方法避免了额外导入的需要,也避免了提前指定等待的元素的必要性。

我应该提到的一件事是,有时候我仍然会回到时间。例如,在输入输入之后,le(1)。 Implicitly_wait将给出一个元素出现的时间,但它不会导致命令等待足够长的时间以使UI响应。