即使元素存在,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 个不适用的示例。谢谢指出 如果你比较一个有效和一个无效的结构,有什么不同吗?例如,想到的一件事是,您是否有一个高于&lt;div id="application_name_list"&gt;iframe 我检查了整个html,没有iframe。我在提交之前尝试比较 html,但它们具有相同的结构。这是一个示例。 &lt;div id="application_name_list" class="ant-col-8 dyff-home-app-search-result-item" style="padding-left: 6px; padding-right: 6px;"&gt; &lt;a href="/dyfflaunch/domain/gco/app/di_kafka_configservice_agentqueuegroup_dim_v1-prod/features"&gt;di_kafka_configservice_agentqueuegroup_dim_v1-prod&lt;b/&gt; &lt;/a&gt; &lt;/div&gt; 我看到工作示例有一个空格作为 a 节点的 text() 值,但如果这是造成差异的原因,我会感到非常惊讶。我看到divs 是搜索的结果,对吗?其中一些结果是否在可见屏幕之外,即您是否需要滚动才能到达它们?如果是这样,这些(可见屏幕之外的)是失败的结果吗?如果是这种情况,请使用 ActionChains 使元素成为焦点:ActionChains(driver).move_to_element(a_tag).click().perform() 找到解决方案link

以上是关于即使元素存在,Selenium find_element 也会抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

即使元素存在,Selenium find_element 也会抛出异常

Selenium - 等到元素存在、可见且可交互,即使在 C# 中的可滚动模式上也是如此

selenium BY定位

python+selenium自动化测试——切换句柄

Capybara Element not found 错误,即使元素存在

如何循环每个元素