:PyCharm 2021.3.2 (CE);OS: fedora35VM
我正在编写一个python selenium脚本来从一个网站中抓取数据。我想浏览一个网站,找到一个元素并打印出来。当元素存在时,我能够做到这一点。我的问题是,有时元素不存在&我得到了一个异常。如果在使用此代码时元素不存在:
RemainDeductible = (WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "b8-b36-Input_RemainAmtYr1"))).get_attribute("value"))
脚本产生以下异常:
Traceback (most recent call last):
File "...PythonSeleniumScript.py", line 152, in <module>
RemainDue = (WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "b8-b36-Input_RemainAmtYr1"))).get_attribute("value"))
File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/support/wait.py", line 89, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
Stacktrace:
WebDriverError@chrome://remote/content/shared/webdriver/Errors.jsm:183:5
NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.jsm:395:5
element.find/</<@chrome://remote/content/marionette/element.js:300:16
如果发生超时值异常,我想捕获异常&将"Remain“变量设置为字符串”空白“。如果在代码中使用Try,仍然会得到以下超时异常,如下所示:
try:
RemainDue = (WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "b8-b36-Input_RemainAmtYr1"))).get_attribute("value"))
except TimeoutException:
RemainDue = "BLANK"
我还是有超时值异常。我以为我的代码会抓住例外。为什么它没有抓住它?
Traceback (most recent call last):
File "...PythonSeleniumScript.py", line 155, in <module>
RemainDue = (WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "b8-b36-Input_RemainAmtYr1"))).get_attribute("value"))
File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/support/wait.py", line 89, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
Stacktrace:
WebDriverError@chrome://remote/content/shared/webdriver/Errors.jsm:183:5
NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.jsm:395:5
element.find/</<@chrome://remote/content/marionette/element.js:300:16
我试图找到的元素的相关HTML是:
<input id="b8-b36-Input_RemainAmtYr1"
class="form-control OSFillParent" data-
input="" disabled="" type="text"
style="margin-top: 5px;" value="$10.50">
event
当然,当元素存在时,代码也能工作。我的问题是,当元素为而不是时,代码会与超时异常一起崩溃。当超时异常发生时,我如何捕获超时异常&将“仍然到期”变量设置为字符串“空白”?
发布于 2022-03-21 12:24:58
我想在这里提出几点建议:
except TimeoutException:
试着使用
except:
我知道最好捕获特定的异常类型,而不是任何异常,但我仍然建议在这里这样做。
2)我建议使用visibility_of_element_located
而不是presence_of_element_located
,因为presence_of_element_located
只会等待页面上出现这样的元素,而不是完全呈现。而visibility_of_element_located
将等待更成熟的元素状态,当它是可见的。
所以而不是
try:
RemainDue = (WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "b8-b36-Input_RemainAmtYr1"))).get_attribute("value"))
except TimeoutException:
RemainDue = "BLANK"
我建议你用
try:
RemainDue = (WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.ID, "b8-b36-Input_RemainAmtYr1"))).get_attribute("value"))
except:
RemainDue = "BLANK"
还要确保b8-b36-Input_RemainAmtYr1
的b8-b36-Input_RemainAmtYr1
值是固定的,而不是更改的。
https://stackoverflow.com/questions/71557425
复制相似问题