当前位置: 首页 > 知识库问答 >
问题:

Python 3 Selenium WebDriverWait导致脚本永久挂起/冻结

阚允晨
2023-03-14

对我来说,预期的行为是要么打印“get_records-acquired pager”,要么在10秒后引发TimeoutException。

[...]
logging.info("get_records - Getting url: {}".format(url))
driver.get(url)
logging.info("get_records - Loaded")
# Get records number and result pages
elem = WebDriverWait(driver, 10).until(ec.element_to_be_clickable(
    (By.XPATH, "//td[@align='right']/span[@class='pager']"))
)
logging.info("get_records - Acquired pager")
[...]

Python版本:3.7.3Selenium版本:3.141.0Firefox版本:70.0.1

以前的版本似乎也发生了类似的bug(Selenium WebDriver(2.25)超时不起作用),但该bug已经关闭。

似乎在elem防止脚本冻结之前添加time.sleep(0.5)(打印“get_records-acquired pager”,或者引发timeoutException)。即使这是问题的一个转机,我也不愿强迫等待。

共有1个答案

龙俊德
2023-03-14

我实际上也有同样的经历,剧本一开始很好,但过了一段时间就永远挂了。“10秒”超时是WebDriver/Browser在10秒内尝试打开一个页面。但是没有定义python脚本向WebDriver/Browser发送请求的超时时间。默认情况下,它是none,这意味着请求将无限地等待。

简短的回答:

driver.command_executor.set_timeout(10)
driver.get(url)

解释:

当你打电话的时候

elem = WebDriverWait(driver, 10).until(ec.element_to_be_clickable(
    (By.XPATH, "//td[@align='right']/span[@class='pager']"))
)

您实际上是在向“控制进程”发送一个请求,它是一个http服务器,并告诉它做一些事情(在当前页面中找到一些元素)。超时'10'意味着“控制进程”告诉浏览器在10秒内打开一个页面,然后取消并将超时状态返回给python脚本。

但这里真正发生的是“控制过程”正在接收请求,但没有响应。我真的不知道在“控制过程”中发生了什么。

 类似资料:
  • 我对CloseableHttpClient管理的连接有问题。Spring服务管理纽约连接: 当执行不成功时,我的setPayment方法最多调用3次。有时在第一次执行后,我的方法挂起而没有响应。欢迎任何建议。

  • 问题内容: 我已经定义了此路由,但是对它的任何请求都会卡在“待处理”中并永远运行。 当我记录代码时,我看到后面跟着,这意味着find方法中的代码永远不会执行 模型 关于这是为什么的任何想法? 问题答案: 在您致电之前,您的猫鼬查询只会简单地排队。 在启动代码中添加如下代码以进行连接: 在连接字符串中,用数据库名称替换。

  • 我已经将WordPress网站迁移到新的服务器(Ubuntu)上,运行良好。 但是永久链接设置不起作用。所有其他页面返回我404错误。 我已经启用了 当我使用自定义结构和类型/%postname%时,它会显示Permalink结构已更新。当访问页面时,返回404错误。 我正在使用/var/www/html/wordpress Installation directory/作为一个文件夹,我已将/e

  • 我是PHP和phpseclib实现的新SSH。 我有以下代码: 我在这里试图完成的是将用户在远程服务器上选择的文件复制到同一服务器上的新目录。在执行脚本时,它成功地找到第一个文件并将其复制到新目录,但之后脚本就停止了。即使用户只选择了一个项目,脚本也会挂起并且不会继续。它甚至不增加 对可能发生的事情有什么想法吗? 更新: 实时NET_SSH2日志 我还直接在服务器上运行了这个命令,它工作得非常好。

  • 我正在尝试理解kotlin协程,我来自C#,在kotlin中有一些我不理解的地方。在这种情况下,我正在使用Qukus框架中的静态编程语言编写一个webapi。从我可以看出,如果我将控制器(或资源)函数标记为挂起函数,Qukus将自动在协程中启动它。 我的问题是,我不知道挂起该协程的首选方法是什么。我在kotlin协程上看到的绝大多数示例都使用delay()函数,该函数在内部使用suspendCan

  • 我已经从Rails 3.2.13升级到Rails 4.0.0。我修复了所有弃用警告(除了secret_base_key),升级了database_cleaner,rspec,rspec-rails,水豚,selenium-webcher和poltergeist到最新版本。 现在,当我通过rake或rspec运行我的规范时,rspec的输出最终会挂起,总是挂在特性测试(javascript测试)上。