从这个链接,我假设首先应该将DOM整体加载到RAM中。
但是后来我在Selenium中测试了超时异常。似乎甚至引发了超时异常,已经可以找到一些元素,因此它不是一个空对象。
但是我想知道,如何确保某些元素已经加载?例如HTML示例,如何确定所有<th>元素都已加载?鉴于我实际上并不知道<th>元素的数量。
<th>
代码试用:
driver = webdriver.Chrome() driver.set_page_load_timeout(10) try: driver.get(url) print('load success!') except TimeoutException: print(self.page_source)
HTML示例:
<table width="910" border="0" cellpadding="3" cellspacing="0" id="fth1_" class="fth1_" style="display: none; position: fixed; top: 29px; left: 99px;"> <thead style="background-color: rgb(233, 233, 233);"> <tr align="center"> <th id="f13" style="width: 121px;"><a href="t/?i=614&o=1">Symbol</a></th> <th id="f13" style="width: 267px;"><a href="t/?i=614&o=2">Name</a></th> </tr> </thead> </table>
根据你的代码试验使用的是 ChromeDriver 和 Chrome的浏览器 ,以 自动化 的步骤。配置完后,由于在通过配置set_page_load_timeout(10)的 时间 内未完全加载页面,因此引发了 超时 异常set_page_load_timeout()。但是,当您调用print(self.page_source)了部分呈现的 HTML DOM 内呈现的元素时,将对其进行检索。
set_page_load_timeout(10)
set_page_load_timeout()
print(self.page_source)
现在关于您的单个查询:
How can I make sure some elements are already loaded?:理想的 测试用例 将具有确定的步骤,例如,验证元素的存在,验证元素的可见性或验证元素的交互性(单击时)。从这个角度来看,验证 已经加载 的 元素 可能不包含所需的元素。因此,您需要将 搜索标准 范围缩小到某个确定的事物,而不是像这样 更宽泛 的 搜索条件 ,例如
How can I make sure some elements are already loaded?
实现这些缩小 搜索条件 可以节省大量的 执行时间 的帮助下 WebDriverWait 与inconjunction expected_conditions 。
WebDriverWait
expected_conditions
How can I make sure all elements are loaded? :同样,我们的测试应仅集中在我们需要与之交互的元素上,而忽略验证与我们无关的其他元素的状态/条件。
How can I make sure all elements are loaded?
现在,按照上面提到的两点,这是3种最常用的用 例 :
presence_of_element_located
visibility_of_element_located
element_to_be_clickable
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC headerList = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@class='fth1_' and @id='fth1_']/thead/tr//th")))
注意 :此插图中使用的 xpath 是仅用于演示目的的示例 xpath 。