Python Selenium在向下滚动页面中捕获验证码

时间:2016-01-03 09:32:13

标签: python selenium

我想用python和selenium捕获验证码。到目前为止,我有这个:

elem = driver.find_element_by_css_selector("#imagecpt")
loc, size  = elem.location, elem.size
left, top     = loc['x'], (loc['y'] - 587)
width, height = size['width'], size['height']
box = (int(left), int(top), int(left+width), int(top+height))
screenshot = driver.get_screenshot_as_base64()
img = Image.open(StringIO.StringIO(base64.b64decode(screenshot)))
captcha = img.crop(box)
captcha.save('captcha.png', 'PNG')

代码正常运行,但有一个小问题,elem.location返回的最高位置是网站中的完整位置。

要在我的网站中捕获验证码,我需要向下滚动页面,因为Selenium仅为网站的可见部分截取屏幕截图,elem.location返回的顶部尺寸无效。

要解决滚动问题,我使用硬编码- 587。如何在没有这个硬编码值的情况下重写代码?

1 个答案:

答案 0 :(得分:1)

使用ActionChains.move_to_element()方法滚动到验证码。

另外,请查看Selenium文档中的location_once_scrolled_into_view,因为它可能会有所帮助。

  

该物业可能会在没有警告的情况下改变。用它来发现在哪里   在屏幕上的元素是我们可以点击它。这种方法   应该导致元素滚动到视图中。

     

返回屏幕上的左上角位置,如果是,则返回None   元素不可见。

from selenium.webdriver import ActionChains

elem = driver.find_element_by_css_selector("#imagecpt")

action_chain = ActionChains(driver)
action_chain.move_to_element(elem)
action_chain.perform()

loc, size = elem.location_once_scrolled_into_view, elem.size
left, top = loc['x'], loc['y']

width, height = size['width'], size['height']
box = (int(left), int(top), int(left + width), int(top + height))

screenshot = driver.get_screenshot_as_base64()
img = Image.open(StringIO.StringIO(base64.b64decode(screenshot)))

captcha = img.crop(box)
captcha.save('captcha.png', 'PNG')