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

dal*_*ous 3 python selenium xlrd selenium-webdriver

下面是我的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 ()
Run Code Online (Sandbox Code Playgroud)

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

总结和解决方案 答案如下.我愚蠢的东西有一些语法错误.这个页面也非常有用.

Erk*_* M. 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')))
Run Code Online (Sandbox Code Playgroud)