Python Selenium ChromeDriver无需等待页面加载

时间:2017-12-19 06:35:09

标签: python selenium web-crawler selenium-chromedriver

我有一套Web浏览器,使用Selenium ChromeDriver在Python 3.6中运行。所有这些都非常完美。

本周我将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)

Message: no such element: Unable to locate element: 
{"method":"name","selector":"txtClave"}
(Session info: chrome=63.0.3239.108)
(Driver info: chromedriver=2.34.522940 
(1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 10.0.15063 x86_64)

Message: no such element: Unable to locate element: 
{"method":"xpath","selector":"//*[@id="ctl00_cp_wz_ddlTarjetas"]/option[2]"}
(Session info: chrome=63.0.3239.108)
(Driver info: chromedriver=2.34.522940 
(1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 10.0.15063 x86_64)

Message: no such element: Unable to locate element: 
{"method":"xpath","selector":"//*[@id="ctl00_cp_wz_ddlTarjetas"]/option[3]"}
(Session info: chrome=63.0.3239.108)
(Driver info: chromedriver=2.34.522940 
(1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 10.0.15063 x86_64)

Message: no such element: Unable to locate element: 
{"method":"xpath","selector":"//*[@id="ctl00_cp_wz_ddlTarjetas"]/option[4]"}
(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 has stopped working

在查看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)

...

self.driver.switch_to.default_content()
self.driver.switch_to_frame('Fmenu')
self.driver.find_element_by_xpath(XPATH_POSICIONGLOBAL).click()

发现它过于悲伤(并且基本上是放弃)以失败过度添加显式等待到每个元素进行交互(可能是因为我有超过一百个?)。

我希望有人帮助我找出可能导致一整套工作蜘蛛在这些新版本的ChromeDriver / Selenium中无法抓取的问题,并为此解决代码优雅且易于实施的解决方案。

例如,我尝试将implicitly_wait附加到WebDriver会话中,但它根本不起作用。

def __init__(self):
    self.driver = webdriver.Chrome(PATH_WEBDRIVER)
    self.driver.implicitly_wait(10)

最后,我使用IDLE一次运行两个失败的蜘蛛1行,它的工作原理!那么......为什么它不能在常规蜘蛛执行中工作?????

许多,非常感谢提前

1 个答案:

答案 0 :(得分:0)

让我试着逐一解决你的错误:

  • Message: no such frame :如果您尝试在帧可用之前切换到该帧,则会出现此错误。在这种情况下,您需要使用匹配的 WebDriverWait 来强制{strong> expected_conditions ,以便frame可用于切换。这是一个详细的Discussion。请参阅 A Better Approach to Switch Frames 部分。
  • Message: no such element: Unable to locate element: :如果您尝试互动的WebElement不是 present,则会出现此错误 visible clickable interactable 。在这种情况下,您需要使用匹配的expected_conditions来强制 WebDriverWait 。以下是广泛使用的 methods

    的列表
    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 has stopped working :如果您的系统 JDK 版本 Selenium 版本, ChromeDriver 版本与 Chrome Browser 版本相互兼容且不同步。

  • self.driver.find_element_by_name('txtUsuario').send_keys(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_wait(10) :尝试摆脱 Implicit Wait 。要使领先的 WebDriver 实例与尾随的 Web Client 保持同步,我们必须使用 WebDriverWait ExplicitWait 。但是,您不应该将 Implicit Wait ExplicitWait 混淆。请参阅下面的Note

  

注意Selenium Documentation清楚地说 - WARNING: Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example setting an implicit wait of 10 seconds and an explicit wait of 15 seconds, could cause a timeout to occur after 20 seconds.

琐事:

如果要求仅为 Scraping / Crawling 网页,请使用 Beautifulsoup 进行抓取/抓取并仅使用 Selenium 浏览网页。