? ? ? ? 使用selenium打开浏览器,模拟人工进行淘宝的登陆活动可以在网上找到两种解决方案。
? ? ? ? 第一种方案是打开网站后,通过find_element_by_xpath 依次寻找用户名录入框,密码录入框,登陆按钮点击框。如果有滑块的话,还需要找到滑块,模拟操作滑块移动到右方。
? ? ? ? 第二种方案是使用pyautogui中的图像匹配功能,需要提前将用户名登陆框,登陆按钮截图作为匹配模板,找到每一部分在屏幕上的位置,使用pyautogui.leftClick 模拟点击屏幕,pyautogui.typewrite(username) 模拟键盘输入,即可。由于pyautogui是屏幕操作,所以必须保证selenium打开的浏览器窗口当前处于活跃状态。
? ? ? ? 笔者在尝试的时候,使用的是firefox浏览器,在这两种方法里输入密码的时候均出现滑块,而滑块操作代码无效,或许firefox也需要有一些额外的设置,最终还是在Chrome下成功。
# 初始化浏览器
if tag == 'Firefox':
binary = FirefoxBinary("D:\\Program Files\\firefox\\firefox.exe")
self.browser = webdriver.Firefox(firefox_binary=binary)
else:
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
self.browser = webdriver.Chrome(options=options)
?此处初始化Chrome浏览器时,重要的一点是必须开启开发者模式, 也就是这块options.add_experimental_option('excludeSwitches',?['enable-automation'])??,如果不开启,那么滑块必然会出现,开启后,还没有发现有滑块出现。
? ? ? ? 第一种方案
self.browser.find_element_by_xpath('//input[@name="fm-login-id"]').send_keys(username)
self.browser.find_element_by_xpath('//input[@name="fm-login-password"]').send_keys(password)
self.browser.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click() # 第一次点击登录按钮
? ? 查找用户名录入框,录入用户名,查找密码录入框,录入密码,尝试点击登陆按钮。
? ? ?第二种方案
# 进入登陆窗口
self.browser.get('https://login.taobao.com/member/login.jhtml')
# 匹配用户名录入框
coords = pyautogui.locateOnScreen('D:\\input.png')
if coords is not None:
x, y = pyautogui.center(coords)
# 点击用户名录入框
pyautogui.leftClick(x, y)
pyautogui.typewrite(username)
pyautogui.press('tab')
pyautogui.typewrite(password)
# 匹配登陆按钮
coords = pyautogui.locateOnScreen('D:\\login.png')
if coords is not None:
x, y = pyautogui.center(coords)
# 点击登陆按钮
pyautogui.leftClick(x, y)
? ? 先匹配用户名录入框,找到之后模拟点击,输入用户名,随后模拟Tab按钮,切换焦点到密码录入框,再录入密码。随后匹配登陆按钮,模拟点击登陆按钮,即可。
? ? 此处需要注意的是pyautogui打开图片时,路径应该采用绝对路径名,且不支持中文。我的python文件是在中文目录下,一开始使用 pyautogui.locateOnScreen('input.png') 提示有错误,应该是无法找到文件。随后换到一个英文路径下,也不行。只有采用一个绝对路径名才不报错。
? ? ? ? ?滑块功能现在还没有尝试成功,留待下次再试。
2021年10月07日
参考以下文章
selenium淘宝登录和滑块破解最新可用
通过selenium+pyautogui模拟登陆淘宝(完美实现)
|