我想用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
。如何在没有这个硬编码值的情况下重写代码?
答案 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')