即使元素存在,Selenium find_element 也会抛出异常
Posted
技术标签:
【中文标题】即使元素存在,Selenium find_element 也会抛出异常【英文标题】:Selenium find_element throwing exception even though the element exists 【发布时间】:2020-07-20 20:20:27 【问题描述】:我的代码:
soup = BeautifulSoup(driver.page_source,features="html.parser")
applications_domains = []
for card in soup.find_all("div", "class":"ant-row"):
for url in card.find_all("a"):
applications_domains.append(url.get("href"))
for aplications_domain in aplication_domains:
try:
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,"//a[@href='" +
applications_domain + "']")))
driver.find_element_by_xpath("//a[@href='" + applications_domain + "']").click()
except:
soup = BeautifulSoup(driver.page_source,features="html.parser")
print(soup.find_all("a","href":applications_domain))
print(f"test error applications_domain")
print("-----------------------")
我有一个问题,find_element_by_xpath
找不到该元素,即使它存在。我使用soup
仔细检查了该元素是否确实存在并且它是否按照输出进行。
输出:
<a href="applications_domain"><b></b></a>
test error applications_domain
我有一个循环遍历每个应用程序域(包含来自每个 href
的数据)但是,它大多数时候会找到并单击 a href
元素,但对于某些人来说却没有,我不知道为什么。
这是网站的 html。有很多div id="application_name_list"
,每个都包含不同的a href
,我需要点击它们
<div class="ant-row" style="margin-left: -6px; margin-right: -6px;">
<div id="application_name_list" class="ant-col-8 dyff-home-app-search-result-item" style="padding-left: 6px; padding-right: 6px;">
<a href="/dyfflaunch/domain/gco/app/di_data_customer_experience_conversation_processor/features">di_data_customer_experience_conversation_processor<b></b></a>
</div>
<div id="application_name_list" class="ant-col-8 dyff-home-app-search-result-item" style="padding-left: 6px; padding-right: 6px;">
<a href="/dyfflaunch/domain/gco/app/di_kafka_configservice_agentqueuegroup_dim_v1-prod/features">di_kafka_configservice_agentqueuegroup_dim_v1-prod<b></b></a>
</div>
<div id="application_name_list" class="ant-col-8 dyff-home-app-search-result-item" style="padding-left: 6px; padding-right: 6px;">
<a href="/dyfflaunch/domain/gco/app/di_kafka_configservice_phoneinventory_dim_v1-prod/features">di_kafka_configservice_phoneinventory_dim_v1-prod<b></b></a>
</div>
</div>
enter code here
【问题讨论】:
您的代码是您运行的确切代码还是只是模型?我看到 for 循环不正确。您正在“applications_domains”列表中附加 url,并且正在循环“aplication_domains”。 @Roitko : 你能分享你的 url 或相关的 HTML 吗? @AzharSyed 抱歉,我拼写错误。现已修复。 @Kunduk 添加了 html。 【参考方案1】:问题是由重叠引起的,按照Solution解决
返回的错误消息是selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point
,但由于我对错误处理的了解不足,错误未按预期显示。谢谢大家的帮助!
【讨论】:
您会在原始帖子中提到该错误。它会在两个小时前解决。 @KunduK 我没有意识到错误,因为我没有输出它。这是我初学者的错误,我为浪费大家的时间而道歉! 我并不苛刻。我希望你明白我的意思。它的经验教训总是提供更多信息,比如你是否遇到任何错误,这有助于 OP 提供解决问题的方法。祝你一切顺利。学习愉快.【参考方案2】:我建议使用 WebDriverWait() 并等待 visibility_of_all_elements_located
() 然后使用以下 css 选择器点击。
driver.get("url here")
WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,".ant-row")))
for link in driver.find_elements_by_css_selector(".ant-row>#application_name_list>a[href]"):
link.click()
如果你想用漂亮的汤和硒来做到这一点,那就试试这个吧。
driver.get("url here")
WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,".ant-row")))
soup = BeautifulSoup(driver.page_source,features="html.parser")
applications_domains = []
for url in soup.select(".ant-row>#application_name_list>a[href]"):
applications_domains.append(url['href'])
for applications_domain in applications_domains:
try:
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//a[@href='" + applications_domain + "']")))
driver.find_element_by_xpath("//a[@href='" + applications_domain + "']").click()
except:
soup = BeautifulSoup(driver.page_source,features="html.parser")
print(soup.find_all("a","href":applications_domain))
print("test error applications_domain")
print("-----------------------")
【讨论】:
最困扰我的是a href
存在于applications_domains
列表中,并且可以使用soup
找到它。我会尝试做另一个WebDriverWait
。
@Roitko :您发布的示例 html 对我来说效果很好。如果可以分享 url,那么我会更好地知道为什么这对您不起作用。谢谢.
很遗憾,我无法共享 HTML,因为它只能在 Extranet 上运行。不过,感谢您对此进行调查!【参考方案3】:
这是一种非常通用的方法:
a_tags=driver.find_elements_by_xpath("//div[@id='application_name_list']//a")
for a_tag in a_tags:
a_tag.click()
如果您有示例说明这不起作用,请在问题中添加一个。
【讨论】:
添加了 3 个不适用的示例。谢谢指出 如果你比较一个有效和一个无效的结构,有什么不同吗?例如,想到的一件事是,您是否有一个高于<div id="application_name_list">
的iframe
。
我检查了整个html,没有iframe
。我在提交之前尝试比较 html,但它们具有相同的结构。这是一个示例。 <div id="application_name_list" class="ant-col-8 dyff-home-app-search-result-item" style="padding-left: 6px; padding-right: 6px;"> <a href="/dyfflaunch/domain/gco/app/di_kafka_configservice_agentqueuegroup_dim_v1-prod/features">di_kafka_configservice_agentqueuegroup_dim_v1-prod<b/> </a> </div>
我看到工作示例有一个空格作为 a
节点的 text() 值,但如果这是造成差异的原因,我会感到非常惊讶。我看到div
s 是搜索的结果,对吗?其中一些结果是否在可见屏幕之外,即您是否需要滚动才能到达它们?如果是这样,这些(可见屏幕之外的)是失败的结果吗?如果是这种情况,请使用 ActionChains
使元素成为焦点:ActionChains(driver).move_to_element(a_tag).click().perform()
。
找到解决方案link以上是关于即使元素存在,Selenium find_element 也会抛出异常的主要内容,如果未能解决你的问题,请参考以下文章
即使元素存在,Selenium find_element 也会抛出异常
Selenium - 等到元素存在、可见且可交互,即使在 C# 中的可滚动模式上也是如此