正在从工作中删除无聊的东西。在下面,您可以找到Python的Selenium库,用于访问包含德国公司注册信息的网站。它执行以下操作:
然后,该站点要求您登录才能下载注册表,因此,您最后应该看到的是登录页面。我首先向您显示错误,如果在底部显示错误,它将显示为代码的一部分。
追踪(最近通话):在第28行的文件“ C:/Users/adria/.PyCharmCE2019.1/config/scratches/Handelsregister_login_downloadCD.py”choice_class_CD_0 = chrome.find_element(by = By.CLASS_NAME,value ='RegPortErg')文件“ C:\ Users \ adria \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,行978,在find_element中'value':value})['value']执行中的文件“ C:\ Users \ adria \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,第321行self.error_handler.check_response(响应)文件“ C:\ Users \ adria \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py”,第242行,在check_response中引发exception_class(消息,屏幕,堆栈跟踪)selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“方法”:“ css选择器”,“选择器”:“。RegPortErg”}(会话信息:chrome = 78.0.3904.108)
现在,下面的代码如何工作,而一旦删除#注释的字符串却没有一次,却放弃了上面的错误呢?
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
chrome = webdriver.Chrome(executable_path=r"C:\Users\...\Desktop\chromedriver_win32\chromedriver.exe")
chrome.get('https://www.handelsregister.de/')
assert "Register" in chrome.title
normal_search = chrome.find_element(by=By.ID, value='main.search')
normal_search.send_keys(Keys.ENTER)
# input_company_name_0 = chrome.find_element_by_id('container')
# input_company_name_1 = chrome.find_element_by_id('inhalt')
# input_company_name_2 = chrome.find_element_by_id('suchparameterForm')
input_company_name = chrome.find_element_by_name('schlagwoerter')
input_company_name.clear()
input_company_name.send_keys('Sparkasse Dortmund')
keywords = chrome.find_element_by_id('schlagwortOption3')
keywords.send_keys(Keys.SPACE)
find_button = chrome.find_element_by_id('submitBtn')
find_button.send_keys(Keys.ENTER)
choose_class_CD_0 = chrome.find_element(by=By.CLASS_NAME, value='RegPortErg')
# choose_class_CD_1 = chrome.find_element(by=By.CLASS_NAME, value='RegPortErg_RandRechts')
choose_CD = chrome.find_element(by=By.LINK_TEXT, value="CD")
choose_CD.send_keys(Keys.ENTER)
对我来说,注释会影响您的代码似乎有点奇怪,除非您用来运行Python的解析器存在一些固有的问题,这是令人怀疑的。
您正在收到NoSuchElementException
-在尝试找到该元素之前,可能会在页面上查找的元素未完全加载。这将导致您看到的异常。
要解决此问题,我会在代码中添加一些WebDriverWait
,以便在尝试查找元素之前先等待它们。
这是我重构您的代码的方式:
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
from selenium.webdriver.common.keys import Keys
chrome = webdriver.Chrome()
chrome.get('https://www.handelsregister.de/')
assert "Register" in chrome.title
# wait on & locate 'normal search'
normal_search = WebDriverWait(chrome, 10).until(EC.presence_of_element_located((By.ID, "main.search")))
normal_search.send_keys(Keys.ENTER)
# wait on & input 'company name'
input_company_name = WebDriverWait(chrome, 10).until(EC.presence_of_element_located((By.NAME, "schlagwoerter")))
input_company_name.clear()
input_company_name.send_keys('Sparkasse Dortmund')
# select the radio button
chrome.find_element_by_id('schlagwortOption3').click()
# find and click submit button
chrome.find_element_by_id('submitBtn').click()
# wait for this element to exist before locating it
choose_class_CD_0 = WebDriverWait(chrome, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "RegPortErg")))
choose_CD = chrome.find_element(by=By.LINK_TEXT, value="CD")
choose_CD.send_keys(Keys.ENTER)
chrome.close()
chrome.quit()