所以我开始使用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语句获得零值。但事实并非如此。所以目前我不知道发生了什么,需要一些帮助才能搞清楚。
答案 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)
上面的代码已经过测试。