Python / Selenium-代码中的注释显然在触发NoSuchElementException方面有所不同

问题描述 投票:2回答:1

正在从工作中删除无聊的东西。在下面,您可以找到Python的Selenium库,用于访问包含德国公司注册信息的网站。它执行以下操作:

  1. 打开Handelsregister网站,
  2. 寻找“正常搜索”按钮并按下,
  3. 查找必须输入公司名称的字段,
  4. 输入所选公司的名称,
  5. 将搜索方式更改为“包含公司的确切名称,然后按”查找”按钮,
  6. 按下“ CD”按钮(CD是一种寄存器)。

然后,该站点要求您登录才能下载注册表,因此,您最后应该看到的是登录页面。我首先向您显示错误,如果在底部显示错误,它将显示为代码的一部分。

追踪(最近通话):在第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 selenium selenium-webdriver selenium-chromedriver nosuchelementexception
1个回答
0
投票

对我来说,注释会影响您的代码似乎有点奇怪,除非您用来运行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()
© www.soinside.com 2019 - 2024. All rights reserved.