【问题标题】:Selenium "No such element error" but the element is foundSelenium“没有这样的元素错误”但找到了元素
【发布时间】:2020-11-17 08:48:38
【问题描述】:

我正在编写一个 selenium webscraper,我遇到了一个问题,Selenium 告诉我在网页上没有找到这样的元素,但是该元素应该被点击并被点击。据我了解,这应该是不可能的,因为没有找到该元素。这是我要抓取的网页 [https://www.sreality.cz/adresar/mm-reality-praha-nove-mesto/1019]。我正在尝试抓取顶部的公司名称、按钮中的报价数量、地址、电话号码和电子邮件。事情是为了查看电话号码和电子邮件地址,您首先必须单击文本,然后它就会被显示出来。我现在尝试的方法是找到元素 - 单击它 - 将信息保存到变量中。据我了解,这是发生错误的地方。但是当我运行代码时,元素被显示出来,所以点击肯定发生了,但是程序结束并告诉我找不到元素。这是我遇到问题的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import time
import csv

path = "/home/user/Projects/Scraper/chromedriver"
driver = webdriver.Chrome(path)
driver.get("https://www.sreality.cz/adresar/mm-reality-praha-nove-mesto/1019")
wait = WebDriverWait(driver, 10)

with open('SRealityDetails.csv', 'w', newline='') as f:
    thewriter = csv.writer(f)

while True:
    try:
        information_list = wait.until(ec.presence_of_all_elements_located((By.CLASS_NAME, "ng-binding")))
        for item in information_list:
            title = driver.find_element_by_xpath("""/html/body/div[2]/div[1]/div[2]/div[2]/div[4]/div/div/div/h1/span[2]""")
            offers = driver.find_element_by_css_selector("a.switcher.ng-binding.ng-scope span.ng-binding.ng-scope")
            addresses = driver.find_element_by_xpath("""/html/body/div[2]/div[1]/div[2]/div[2]/div[4]/div/div/div/div[3]/div/div[1]/table[1]/tbody/tr[1]/td""")
            phone_number = driver.find_element_by_css_selector("button.value.link.ng-binding.ng-scope")
            phone_number.click()
            phone_number = driver.find_element_by_css_selector("span.phone.ng-binding")
            email = driver.find_element_by_css_selector("button.value.link.ng-binding")
            email.click()
            email = driver.find_element_by_css_selector("a.value.link.ng-binding")
            print(title, " ", offers, " ", addresses, " ", phone_number, " ", email)
        time.sleep(10)
    except Exception as e:
        print(e)
        break

这是错误输出:

消息:没有这样的元素:无法找到元素:{“method”:“css 选择器","选择器":"button.value.link.ng-binding.ng-scope"}
(会话信息:chrome=83.0.4103.116)

进程以退出代码 0 结束

不幸的是,一旦“没有找到这样的元素”错误通过,程序就不想继续了。我无法弄清楚为什么会发生此错误,如果有人可以向我解释这是如何发生的以及我做错了什么,我将不胜感激。感谢任何人。

【问题讨论】:

  • 发布完整的回溯,以便我们可以看到哪一行引发了异常。
  • 遗憾的是,回溯不包含导致异常的行。似乎 Selenium 只在某些情况下告诉你这条线。然而,这是我得到的信息:消息:没有这样的元素:无法找到元素:{“method”:“css selector”,“selector”:“button.value.link.ng-binding.ng-scope”} (会话信息:chrome=83.0.4103.116)进程以退出代码 0 结束
  • phone_number = driver.find_element_by_css_selector("button.value.link.ng-binding.ng-scope") 是问题所在。您没有使用任何等待,因此它可能无法获取元素。

标签: python python-3.x selenium selenium-webdriver webdriver


【解决方案1】:

关于你的代码有几件事:

首先,也许您正在尝试打印上面提取的元素的文本。在打印元素时使用text。像这样,

print(title.text, " ", offers.text, " ", addresses.text, " ", phone_number.text, " ", email.text)

其次Process finished with exit code 0 表示,您的代码没有错误。您的代码运行良好。您正在打印的堆栈跟踪只是因为您正在打印e。现在为什么要打印它,原因未知,因为如果没有找到该元素,它将无法点击该元素。

只需尝试删除 except 块中的 print(e)。

第三,你已经在脚本中初始化了WebDriverWait,但是在从网页中提取元素时没有使用它,在提取元素时使用它,它会更简单有效。

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2021-07-07
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多