Python Selenium 一个隐藏的框架,有时与 java 脚本断言一起出现

Posted

技术标签:

【中文标题】Python Selenium 一个隐藏的框架,有时与 java 脚本断言一起出现【英文标题】:Python Selenium a hidden frame that appears sometimes with java script assert 【发布时间】:2020-04-21 03:59:38 【问题描述】:

我在我抓取的这个网站上每周出现几次通知。我无法绕过它。

我可以运行代码。

el =  driver.find_element_by_xpath("//input[@id='btnRead']")
driver.execute_script("arguments[0].click();", el)

这会清除它,但如果我将它留在我的代码中,它会给我一个 no such element 异常。如果我尝试像这样将它包装在 try/catch 中的事件。

from selenium.common.exceptions import NoSuchElementException

try:
    el = driver.find_element_by_xpath("//input[@id='btnRead']")
    driver.execute_script("arguments[0].click();", el)
except NoSuchElementException:
    print(nonefound)
sleep(5)
driver.quit()

这也会清除它,如果它存在,但如果它不存在,则会出错。 我认为我做错了什么,但我已经尝试了几个不同的版本,但我总是收到导致窗口挂起并停止执行其余脚本的错误。

任何想法都会很棒。

【问题讨论】:

this 将是您的答案。请尝试。 我试过这个,但我无法让它工作。我很感激你的帮助。澄清一下,我可以在元素存在时找到它。我只是无法捕捉到错误以阻止代码中断。 【参考方案1】:

你可以检查元素的长度,以防你想继续你的脚本。

如果元素的长度大于 0,则会点击。

if len(driver.find_elements_by_xpath("//input[@id='btnRead']"))>0 :
    el = driver.find_element_by_xpath("//input[@id='btnRead']")
    driver.execute_script("arguments[0].click();", el)
else:
    print("nonefound")

或者诱导WebDriverWait()和visibility_of_element_located()

try:
    el = WebDriverWait(driver,5).until(EC.visibility_of_element_located(("//input[@id='btnRead']")))
    driver.execute_script("arguments[0].click();", el)
except NoSuchElementException:
    print("nonefound")

您需要导入以下库。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException

【讨论】:

非常感谢,我之前尝试过这个版本,一定是在某个地方弄乱了代码。这完全解决了我的问题。我刚刚测试了 10 种不同的方法。【参考方案2】:

除了NoSuchElementException 之外是否还有其他异常。 “挂起”可能来自TimeoutException。尝试在那里打印这样的异常:

from selenium.common.exceptions import NoSuchElementException

try:
    el = driver.find_element_by_xpath("//input[@id='btnRead']")
    driver.execute_script("arguments[0].click();", el)
except Exception as e:
    print(e)
sleep(5)
driver.quit()

【讨论】:

以上是关于Python Selenium 一个隐藏的框架,有时与 java 脚本断言一起出现的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 setAttribute 方法和 Selenium 和 Python 更改 Datepicker 的隐藏元素的日期?

selenium python 针对js生成的下拉列表,如何选择隐藏的选项

python+selenium 定位隐藏元素

如何单击使用 Selenium WebDriver 隐藏的元素?

Python+Selenium ----unittest单元测试框架

(上)python3 selenium3 从框架实现学习selenium让你事半功倍