Selenium Webdriver wait.until不能正常工作

时间:2014-09-09 18:37:29

标签: python selenium selenium-webdriver

所以我开始使用Selenium Webdriver,我遇到了来自selenium.webdriver.support.wait的直到方法的问题。以下是我的代码:

from selenium import webdriver
import time
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait


url = "http://shop.uclastore.com/courselistbuilder.aspx"

driver = webdriver.Firefox()
driver.get(url)
time.sleep(1)

departments = Select(driver.find_element_by_id('clDeptSelectBox'))
for department in departments.options:
    # select department
    departments.select_by_value(department.get_attribute('value'))


    elem = driver.find_element_by_xpath("//select[@id='clCourseSelectBox']//option")
    print elem
    print elem.get_attribute('value')

    wait = WebDriverWait(driver, 10, 1.0)
    wait.until(lambda driver: driver.find_element_by_xpath("//select[@id='clCourseSelectBox']//option"))

    # time.sleep(1)

    elem = driver.find_element_by_xpath("//select[@id='clCourseSelectBox']//option")
    print elem
    print elem.get_attribute('value')
    print

问题在于,当我得到之前和之后打印语句时:

<selenium.webdriver.remote.webelement.WebElement object at 0x108a4af50>
0
<selenium.webdriver.remote.webelement.WebElement object at 0x108a4af90>
0

<selenium.webdriver.remote.webelement.WebElement object at 0x108a4afd0>
0
<selenium.webdriver.remote.webelement.WebElement object at 0x108a4af10>
0

当我注释掉 wait.until 代码并取消注释 time.sleep 时,我得到以下内容:

<selenium.webdriver.remote.webelement.WebElement object at 0x10378de90>
0
<selenium.webdriver.remote.webelement.WebElement object at 0x10378de50>
84082

<selenium.webdriver.remote.webelement.WebElement object at 0x10378df90>
0
<selenium.webdriver.remote.webelement.WebElement object at 0x103767110>
87846

到目前为止,我想到的一种可能性是等待已经找到了 elem ,这意味着我们不应该为第二个print语句获得零值。但事实并非如此。所以目前我不知道发生了什么,需要一些帮助才能搞清楚。

1 个答案:

答案 0 :(得分:2)

问题

您的等待等待driver.find_element_by_xpath("//select[@id='clCourseSelectBox']//option")返回元素。但这是测试的错误。

页面的编写方式,&#34;校园&#34;的<select>元素和&#34;术语&#34;填充了<option>个元素,并预选了一个<option><select>为&#34;部门&#34;填充<option>但未预选任何内容。 &#34;课程&#34;的<select>元素;和&#34;部分&#34;没有填充。

&#34;课程&#34;的<select>元素;当一个&#34;部门&#34;被选中。 但是,在填充此<select>之前, 包含占位符<option>元素,其中包含文字&#34;正在加载...& #34 ;.所以无论何时你寻找//select[@id='clCourseSelectBox']//option,你都会受到打击。在使用wait.until的代码版本中,您会发现在页面上的JavaScript代码有机会将其替换为实际选项之前存在的占位符<option>。在使用time.sleep(1)的代码版本中,您可以花时间让JavaScript完成其工作。但请注意,您所拥有的wait.until电话完全符合您的要求

解决方案

您可以等到该选项的值不是0:

wait.until(lambda driver: driver.find_element_by_xpath(
    "//select[@id='clCourseSelectBox']//option").get_attribute("value") != "0")

请注意,get_attribute要求您的脚本和浏览器之间的往返find_element...往返。以下代码执行相同的操作,但只使用一次往返:

def cond(driver):
    return driver.execute_script("""
    var option = document.querySelector("select#clCourseSelectBox>option");
    return option.value !== "0";
    """)

wait.until(cond)

上面的代码已经过测试。