gpt4 book ai didi

python - Selenium Webdriver wait.until 不起作用

转载 作者:行者123 更新时间:2023-12-01 05:02:35 53 4
gpt4 key购买 nike

因此,我开始使用 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/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com