我有一套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行,它的工作原理!那么......为什么它不能在常规蜘蛛执行中工作?????
许多,非常感谢提前
答案 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
浏览网页。