- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我开始使用 Selenium Webdriver,但在使用 selenium.webdriver.support.wait 的 until 方法时遇到了问题。下面是我的代码:
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
到目前为止,我想到的一种可能性是 wait 已经找到了 elem,这意味着我们不应该为第二个打印语句获得零值。然而,事实并非如此。所以目前我不知道发生了什么,需要一些帮助来弄清楚。
最佳答案
您的等待将等到driver.find_element_by_xpath("//select[@id='clCourseSelectBox']//option")
返回一个元素。但这是测试的错误。
该页面的编写方式是<select>
“Campus”和“Term”的元素填充为 <option>
元素并有一个 <option>
预选的。 <select>
对于“部门”填充 <option>
但没有预先选择任何内容。 <select>
未填充“类(class)”和“部分”的元素。
<select>
当选择“部门”时,“类(class)”元素将被填充。 但是,在此之前<select>
已填充,它确实包含占位符 <option>
包含文本“正在加载...”的元素。因此,每当您寻找//select[@id='clCourseSelectBox']//option
时,你会受到打击。在带有 wait.until
的代码版本中,您会找到占位符 <option>
在页面上的 JavaScript 代码有机会用实际选项替换它之前就存在。在您的代码版本中 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)
上面的代码已经过测试。
关于python - Selenium Webdriver wait.until 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25751520/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!