Selenium find_element выбрасывает исключение, хотя элемент существует - PullRequest
0 голосов
/ 08 апреля 2020

Мой код:

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

У меня есть все oop, которое идет через каждый домен приложения (содержит данные из каждого 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

Ответы [ 3 ]

0 голосов
/ 08 апреля 2020

Я бы предложил использовать 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("-----------------------")
0 голосов
/ 08 апреля 2020

Проблема была вызвана перекрытием и решена в соответствии с Решение Возвращено сообщение об ошибке selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point, но из-за моих плохих знаний об обработке ошибок ошибка не отображалась, как ожидалось. Спасибо всем за помощь!

0 голосов
/ 08 апреля 2020

Это один, довольно общий c способ сделать это:

a_tags=driver.find_elements_by_xpath("//div[@id='application_name_list']//a")

for a_tag in a_tags:
    a_tag.click()

Если у вас есть примеры, где это не работает, добавьте один к вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...