0
点赞
收藏
分享

微信扫一扫

基于selenium实现12306模拟登陆

向上的萝卜白菜 2022-02-10 阅读 104
from selenium import webdriver
from time import sleep

def detect_selenium(browser):
    # 如果window.navigator.webdriver返回True则说明服务器端检测到了是selenium在进行自动化操作,若是False则未检测到
    jsCode = 'return window.navigator.webdriver'
    if browser.execute_script(jsCode) == True:
        print('服务器端检测到selenium!')
    else:
        print('服务器端未检测到selenium!')

def main():
    # 实例化浏览器,并规避selenium检测
    chromedriver = r'E:/Chrome/chromedriver'
    options = webdriver.ChromeOptions()
    options.add_argument('--disable-blink-features=AutomationControlled')
    options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])

    browser = webdriver.Chrome(executable_path=chromedriver, options=options)
    browser.maximize_window()
    browser.get('https://kyfw.12306.cn/otn/resources/login.html')
    detect_selenium(browser)

    # 输入账号密码并点击登陆
    userid_input = browser.find_element_by_id('J-userName')
    passwd_input = browser.find_element_by_id('J-password')
    sleep(0.5)
    userid_input.send_keys('Phone/Email')
    sleep(0.5)
    passwd_input.send_keys('Password')
    sleep(0.5)
    login_btn = browser.find_element_by_id('J-login')
    login_btn.click()
    detect_selenium(browser)

    # 定位到滑块
    # 由于网速的原因,可能在检测滑块的时候滑块还没有加载出来,则会导致出现元素找不到的错误(NoSuchElementException),
    # 因此需要不断定位,直到将该元素定位到。或者使用一个很长的延时以确保滑块加载出来
    # sleep(2)
    while(True):
        try:
            span = browser.find_element_by_id('nc_1_n1z')
            print('已定位到滑块')
            break
        except:
            print('还未定位到滑块!')
            sleep(0.2)

    # 使用动作链将滑块拖动到最右边
    action = webdriver.ActionChains(browser)
    # 拖动方式一
    # action.drag_and_drop_by_offset(span, 300, 0).perform()
    # 拖动方式二
    action.click_and_hold(span)
    action.move_by_offset(300, 0).perform()

    action.release()
    detect_selenium(browser)

    sleep(2)
    browser.quit()

if __name__ == "__main__":
    main()
举报

相关推荐

0 条评论