Selenium找不到从Ajax加载的元素



我一直在尝试访问这个页面上的4张图片:https://altkirch-alsace.fr/serviable/demarches-en-ligne/prendre-un-rdv-cni/

然而,灰色区域似乎是ajax加载的(根据它的类名)。我想让元素<div id="prestations">在它里面,但不能访问它,也不能访问灰色区域内的任何其他元素。

我已经尝试遵循几个类似问题的答案,但无论我等待多久,我得到一个错误,该元素没有找到;当我点击"检查元素"但是当我点击"查看源代码"时,我看不到它。这是否意味着我不能通过硒来访问它?

下面是我的代码:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.get("https://altkirch-alsace.fr/serviable/demarches-en-ligne/prendre-un-rdv-cni/")
element = WebDriverWait(driver, 10) 
.until(lambda x: x.find_element(By.ID, "prestations")) 
print(element)

您没有正确使用WebDriverWait(...).until。你的lambda正在使用find_element,当它被调用并且没有找到元素时抛出异常。

你应该这样使用:

from selenium.webdriver.support import expected_conditions as EC
...
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "prestations"))
)

遇到同样的问题。等待没有问题。网页上有一个框架:

<iframe src="https://www.rdv360.com/mairie-d-altkirch?ajx_md=1" width="100%"
height="600" style="border:0px;"></iframe>

主网站的文档对象模型- DOM不包含加载到框架中的网页的任何信息。即使等待几个小时,你也不会在这个框架内找到任何元素,因为它有自己的DOM。

你需要将WebDriver上下文切换到这个帧。然后你可以访问框架的DOM:

在你的网站上,iframe没有id,你可以搜索所有框架,就像硒网页上描述的(https://www.selenium.dev/documentation/webdriver/browser/frames/):
代码搜索所有类型为&;iframe&;的html标签。取第一个(可能应该是[0]而不是[1])

iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
driver.switch_to.frame(iframe)

现在你可以找到你想要的元素了。

在我的案例中,解决方案是这样的:

<html>
...
<iframe ... id="myframe1">
...
<iframe>
<iframe ... id="myframe2">
...
<iframe>
...
</html>
my_iframe = my_WebDriver.find_element(By.ID, 'myframe_1')
my_Webdriver.swith_to.frame(my_iframe)

也工作:

my_WebDriver.switch_to.frame('myframe_1')

根据Selenium文档,您可以使用iframe的名称,id或元素本身来切换到该框架。

最新更新