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

为什么selenium要等待很长时间才能执行这段代码?

单于亮
2023-03-14

我试图在这个页面上无限滚动,下面是我的代码:

from selenium import webdriver
import time

profile = webdriver.FirefoxProfile()
profile.set_preference("general.useragent.override","Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0")
driver = webdriver.Firefox(profile)

driver.get("http://www.quora.com/Programming-Languages/followers")
for n in range(0,5): # For testing I have capped this at 5, will handle this properly once things start to work.
    driver.execute_script("window.scrollTo(0,1000000);")
    time.sleep(2)

因此,当我运行此程序时,它会在执行任何滚动之前等待很多秒(有时超过1分钟),然后在下次滚动之前再次等待相同的时间。代码在其他页面上似乎运行良好。有没有办法解决这个问题?

当我尝试使用Chrome而不是firefox时,会出现以下错误:driver=webdriver。Chrome('/home/asdf/apps/chromedrive/chromedriver')添加到。py文件。

Traceback (most recent call last):
  File "ok.py", line 8, in <module>
    driver = webdriver.Chrome('/home/asdf/apps/chromedrive/chromedriver')
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/chrome/webdriver.py", line 65, in __init__
    keep_alive=True)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 73, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 121, in start_session
    'desiredCapabilities': desired_capabilities,
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 171, in execute
    response = self.command_executor.execute(driver_command, params)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/remote_connection.py", line 349, in execute
    return self._request(command_info[0], url, body=data)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/remote_connection.py", line 379, in _request
    self._conn.request(method, parsed_url.path, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 973, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 1007, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 969, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 829, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 791, in send
    self.connect()
  File "/usr/lib/python2.7/httplib.py", line 772, in connect
    self.timeout, self.source_address)
  File "/usr/lib/python2.7/socket.py", line 553, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno -2] Name or service not known

共有1个答案

南门飞扬
2023-03-14

切换到Chrome()帮助我解决了这个问题:

import time
from selenium import webdriver

followers_per_page = 18

driver = webdriver.Chrome()
driver.get("http://www.quora.com/Programming-Languages/followers")

# get the followers count
element = driver.find_element_by_class_name('count')
followers_count = int(element.text.replace('k', '000').replace('.', ''))
print followers_count

# scroll down the page iteratively with a delay
for _ in xrange(0, followers_count/followers_per_page + 1):
    driver.execute_script("window.scrollTo(0, 0,1000000);")
    time.sleep(2)

仅供参考,我正在使用一种有点不同的方法:解析关注者的数量并计算每页关注者的数量,同时考虑到它一次加载18个关注者的事实。

实际上,我以前也做过类似的quora问题,参见:

  • 使用selenium python web驱动滚动网页

嗯,这不是我第一次想到的。故事是这样的。

问题是,存在对服务器的挂起请求http://tch840195.tch.quora.com/up/chan5-8886/updates需要几分钟才能完成的URL。这就是selenium认为页面未完全加载的原因。而且,情况越来越糟——这是一个周期性的事情,每X秒发生一次。将其视为长期共享。

我使用Firefoxwebdriver尝试了多种方法来解决这个问题:

>

driver.set_page_load_timeout(3)

设置脚本超时:

driver.set_script_timeout(3)

调用window.stop();希望它将停止活动请求:

driver.execute_script('window.stop();')

更新至最新的Firefox和selenium软件包版本

另一种可能有效的方法是,通过某种方式阻止对该“慢速url”的请求,或者使用代理服务器将firefox指向该url,或者,如果可能,让firefox知道将该url列入黑名单(可能通过扩展名)。

另请参见内部多个解决方法的相关问题:

  • 支持页面加载操作的超时参数

还请参阅:

  • 如何停止页面加载在火狐程序?
  • 当不需要时,Firefox Delayed命令会等待挂起的XMLHttp请求。
  • FirefoxDriverwebdriver.load.strategy不稳定的查找从错误的页面获取元素
  • 在Selenium WebDriver中设置加载页面的实际超时?
  • Selenium Firefox打开超时
 类似资料:
  • 问题内容: 我可以长时间等待Selenium Web Driver吗? 即使我可以像下面那样设置隐式等待命令,它也不会等待我给定的时间。 这里有什么问题吗? 就我而言,我需要执行一个测试用例并等待4分钟,然后执行下一个测试用例。 我在这里使用Java。 问题答案: 其实这不是我的答案,两天前我在这里看到了这个答案,但是我没有时间应用它。今天我尝试了,这就是我想要的。 不幸的是,现在我在这里看不到该

  • 问题内容: 我正在使用Hibernate 4.2,JPA 2.0和Postgres 9.2 代码卡在 在进一步调查中,我发现Hibernate调用了class 方法。此方法尝试加载有关每个数据库对象的元数据 的代码是Postgers的JDBC驱动程序的一部分,而确实是花费时间来执行该方法的驱动程序(我加载了驱动程序源并尝试了跟踪)。但是由于这个问题在Hibernate 3.3(我之前使用过)中没有

  • 问题内容: 我有一个以datetime为参数的查询,我们观察到的是,如果通过变量提供datetime参数,则执行查询的时间比直接对参数进行硬编码要多2 -3倍,是否有任何原因或解决方案?对此 以下查询大约需要5分钟才能返回结果 虽然作为 它会在10到20秒内返回 我并不总是希望在列上使用索引进行搜索。 按照kevchadders的建议,我看到执行计划有很大的不同。使用日期变量的查询正在执行聚集索引

  • 我知道要冬眠。我有一个sql语句 我尝试用createCriteria和HQL实现它。 HQL: 问题是,此HQL的执行时间延长了10倍。并执行许多不必要的查询。我尝试使用注释字符串进行转换,它有了一些改进,但仍然比createCriteria查询长5倍,此外,我无法进行此转换 <代码>列表 版本数据防御

  • 我的Gradle构建需要1分钟到2分钟,我不确定发生了什么。在事件日志中,我大部分时间都只看到一个条目 执行任务:[:app:GenerateDebugSources,:app:PrepareDebugunitTestDependencies,:app:MockableAndroidJar,:app:AssembleDebug] 我不知道这个任务在做什么,我检查了设置,希望这能有所改变,但我运气不

  • 以下代码的并行执行比顺序代码所需的时间长。我知道并行流比顺序流有更多的复杂性和更高的成本,我们不能期望并行流一直都能创造奇迹。我只是关心下面的代码 输出: > 具有顺序流:40 227 795 并行流:74 656 768 这个流有状态吗?如果不是,那么为什么平行流要花更长的时间呢?这背后的原因可能是什么?对此能有一个精确的猜测吗?