一、去掉selenium的webdriver痕迹
问题:
使用selenium+chromedriver启动chrome的时候,会在chrome的navigator以及document对象里注入一些属性,如果web服务器返回的js代码里有对这些属性的检测,那我们就会被识别为机器人在访问。如果进行UI自动化例如滑块等,就会无法进行。
未添加属性是F12里的consloe 使用window.navigator.webdriver可直接检查到webdriver被控制返回true

解决方式:
webdriver.ChromeOptions增加一些属性
class TestGetCaptcha:
def setup_class(self):
# 去掉selenium烦人的webdriver痕迹,防检测
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option(
"excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
chrome_options.add_argument(
'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
self.driver = webdriver.Chrome(chrome_options=chrome_options)查看window.navigator.webdriver可直接检查到webdriver被控制返回false
二、滑动滑块
def test_get_captcha(self):
self.driver.get(url=r'D:/cs.html')
time.sleep(3)
self.driver.switch_to.frame('tcaptcha_iframe')
flag = 0
res = {}
while flag == 0:
ele = self.driver.find_element(By.ID, 'slideBlock')
action = ActionChains(self.driver)
action.drag_and_drop_by_offset(ele, 110, 0).perform()
action.click(ele).perform()
time.sleep(2)
try:
res = self.driver.execute_script('return captcha.getTicket()')
print(res)
if res.get('ticket') != '':
flag = 1
else:
self.driver.refresh()
time.sleep(2)
except:
pass
return res
评论