Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Selenium ChromeDriver不等待页面加载_Python_Selenium_Web Crawler_Selenium Chromedriver_Google Chrome - Fatal编程技术网

Python Selenium ChromeDriver不等待页面加载

Python Selenium ChromeDriver不等待页面加载,python,selenium,web-crawler,selenium-chromedriver,google-chrome,Python,Selenium,Web Crawler,Selenium Chromedriver,Google Chrome,我有一套使用Selenium ChromeDriver在Python 3.6中运行的Web scraper。他们都跑得很完美 本周,我将Selenium更新为v2.8,将ChromeDriver更新为v2.34 立即,铲运机无法正常工作,并在爬行的某个早期点坠毁 我有一个小的sys.stdout实现,它同时输出到.txt和控制台,因此我开始注意到错误如下: Message: no such frame (Session info: chrome=63.0.3239.108) (Driver in

我有一套使用Selenium ChromeDriver在Python 3.6中运行的Web scraper。他们都跑得很完美

本周,我将Selenium更新为v2.8,将ChromeDriver更新为v2.34

立即,铲运机无法正常工作,并在爬行的某个早期点坠毁

我有一个小的
sys.stdout
实现,它同时输出到.txt和控制台,因此我开始注意到错误如下:

Message: no such frame
(Session info: chrome=63.0.3239.108)
(Driver info: chromedriver=2.34.522940 
(1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 10.0.15063 x86_64)

之后通常会出现ChromeDriver崩溃Windows消息,该消息以前从未出现过:
ChromeDriver.exe已停止工作

在查看Chrome窗口并进行调试时,我怀疑错误是由导致爬行器等待页面加载的行引起的,但它没有等待,因此无法找到元素

导致错误的行的示例:

self.driver.find_element_by_name('txtUsuario').send_keys(user + Keys.RETURN)
self.driver.find_element_by_name('txtClave').send_keys(passwd + Keys.RETURN)

发现它太可悲了(基本上是屈服了),以至于无法在每个元素中添加显式等待来进行交互(可能是因为我有100多个?)

我希望有人能帮助我找出是什么原因导致一整套工作爬行器在这些新版本的ChromeDriver/Selenium中爬行失败,并找到一个代码优雅、易于实现的解决方案

例如,我尝试将
隐式地\u wait
附加到WebDriver会话,但它根本不起作用

def __init__(self):
    self.driver = webdriver.Chrome(PATH_WEBDRIVER)
    self.driver.implicitly_wait(10)
最后,我使用IDLE一次运行两个失败的爬行器1行,它工作了!所以为什么它不能正常执行蜘蛛程序


非常非常感谢您让我试着一个接一个地纠正您的错误:

  • 消息:没有这样的帧:如果您试图在可用帧之前切换到该帧,则可能会出现此错误。在这种情况下,您需要使用匹配的
    进行诱导,以便切换
您可以在中找到详细的讨论

  • 消息:无此类元素:无法定位元素:如果您尝试与之交互的元素不存在、可见、可单击或可交互,则可能出现此错误。在这种情况下,你需要用匹配的方法进行诱导。以下是广泛使用的方法列表:

    class selenium.webdriver.support.expected_conditions.presence_of_element_located(locator)        
    class selenium.webdriver.support.expected_conditions.visibility_of_element_located(locator)
    class selenium.webdriver.support.expected_conditions.element_to_be_clickable(locator)
    
  • chromedriver.exe已停止工作:如果系统
    JDK
    版本、版本、版本和版本彼此不兼容且不同步,则可能出现此错误

  • self.driver.find\u element\u by\u name('txtuario')。发送\u键(user+keys.RETURN)
    :尝试按以下两个步骤将行分解:

    self.driver.find_element_by_name('txtUsuario').send_keys(user)
    self.driver.find_element_by_name('txtUsuario').send_keys(Keys.RETURN)
    
  • self.driver.implicitly\u wait(10)
    :尝试摆脱。为了使领先的实例与落后的Web客户端保持同步,我们必须使用,即。但是你不应该和他混在一起。见以下注释:

注意:警告中明确提到-
警告:不要混合使用隐式和显式等待。这样做可能会导致不可预测的等待时间。例如,将隐式等待设置为10秒,显式等待设置为15秒,可能会导致20秒后出现超时。


结论
如果要求仅用于抓取/抓取网页,请使用BeautifulSoup进行抓取/抓取,并使用Selenium仅用于浏览网页。

将等待时间增加到100您的Chrome版本是什么?我使用的是最新的Chrome版本。而且,我怀疑隐式的等待失败了,因为它在10秒或100秒内什么也不做。我将在一段时间后发布它给出的错误,因为我现在不在家。这肯定是一个非常令人失望的问题,我有一些工作非常顺利:(我在WebDriver源代码中挖掘了很多,并怀疑这是一个ChromeDriver bug。我开始应用显式等待方法来重新执行工作,但每个+10个find_元素都有很多spider需要修改,因此我正在考虑编写一个可以附加到驱动程序的定制服务程序(每个spider定义一次)不要为每个失败的元素编写WebDriverWaits find\u element只初始化WebDriverWait一次,并尝试在每个
预期的\u条件
上重用
WebDriverWait
实例。同样,由于您只是在爬行,因此可以将范围缩小到单个
预期的\u条件
,即存在的\u元素。因此,一个合适的想法是编写一个
函数()
,并将相关的
WebElement
作为可刮取/可爬行的返回。希望这能有所帮助。是的。在我的爬行器中实现了两个非常相似的函数:
def custom\u find(self,by,selector):return WebDriverWait(self.driver,30)。直到(EC.visibility\u of\u of\u element((通过,选择器))
…和…
定义自定义帧开关(self,locator):WebDriverWait(self.driver,30)。直到(EC.frame-to-be-available和-switch-to-it(locator))
。通过这种方式,我可以根据需要多次重用WebDriverWait实例,而无需在我的Notepadd++中执行许多复杂的替换。最后,我决定回滚到Chrome 62,因为它完全修复了所述的所有错误。@Jesus21282虽然没有最佳实践,但降级不应该是一个解决方案。请尝试使用最新版本我们将一个接一个地解决这些障碍。
class selenium.webdriver.support.expected_conditions.presence_of_element_located(locator)        
class selenium.webdriver.support.expected_conditions.visibility_of_element_located(locator)
class selenium.webdriver.support.expected_conditions.element_to_be_clickable(locator)
self.driver.find_element_by_name('txtUsuario').send_keys(user)
self.driver.find_element_by_name('txtUsuario').send_keys(Keys.RETURN)