51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1090|回复: 3
打印 上一主题 下一主题

无头浏览器下pykeyboard模拟输入密码时,密码错误输入回了Python原代码区域

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 530 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2022-6-21 10:43:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1测试积点
    我在使用selenium(4.2.0)+pykeyboard模拟键盘(不能直接传入密码,有安全控件)登陆校园网的时候,使用常规有头浏览器方法,可以正常运行,但是当我改为无头浏览器运行的时候,无法正常输入密码,输入密码时密码被写入了源代码的鼠标位置
    学校校园网界面如下

    正常有头浏览器(可以运行)
    import selenium.webdriver
    from selenium.webdriver import Chrome
    from selenium.webdriver.common.by import By  # 最新的selenium用法
    from selenium.webdriver.chrome.service import Service
    from time import sleep
    from pykeyboard import PyKeyboard  # 模拟键盘
    from plyer import notification  #
    s = Service("chromedriver.exe")
    web = Chrome(service=s)
    web.get("http://172.31.85.101")
    # 定义XPATH是否存在的函数、捕获异常
    def exceptionexis(xpath):
        try:
            web.find_element(By.XPATH, xpath)
            return True
        except:
            return False


    if exceptionexis('//*[@id="username"]'):
        web.find_element(By.XPATH, '//*[@id="username"]').send_keys('2019xxxxxx')
        # 定位到密码输入框
        sleep(1)
        web.find_element(By.XPATH, '//*[@id="pwd"]')
        # 输入密码
        k = PyKeyboard()
        k.tap_key(k.tab_key)
        k.tap_key(k.numpad_keys[2], n=2)
        k.tap_key(k.numpad_keys[3])
        k.tap_key(k.numpad_keys[x])
        k.tap_key(k.numpad_keys[x])
        k.tap_key(k.numpad_keys[x])
        # 选择需要的网络类型
        k.tap_key(k.tab_key)
        sleep(1.5)
        web.find_element(By.XPATH, '//*[@id="_service_1"]').click()
        sleep(1)
        # 鼠标定位到登录按钮
        move = web.find_element(By.XPATH, '//*[@id="loginLink_div"]')
        selenium.webdriver.ActionChains(web).move_to_element(move).perform()
        web.execute_script("$(arguments[0]).click()", move)
        web.quit()
        notification.notify(
            title="校园网连接",
            message="校园网认证成功,请开始使用",
            timeout=5
        )
    else:
        web.quit()
        notification.notify(
            title="校园网连接",
            message="校园网已经认证、无需再次连接",
            timeout=5
        )

    无头浏览器运行失败

    import selenium.webdriver
    from selenium.webdriver.common.by import By  # 最新的selenium用法
    from time import sleep
    from pykeyboard import PyKeyboard  # 模拟键盘
    from plyer import notification  #
    # 无头浏览器
    from selenium.webdriver.chrome.service import Service
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options


    s = Service("chromedriver.exe")
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument("--window-size=1920,1080")
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    web = webdriver.Chrome(options=chrome_options)
    # 规避检测
    web.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    web.get("http://172.31.85.101")


    # 定义XPATH是否存在的函数、捕获异常
    def exceptionexis(xpath):
        try:
            web.find_element(By.XPATH, xpath)
            return True
        except:
            return False

    if exceptionexis('//*[@id="username"]'):
        web.find_element(By.XPATH, '//*[@id="username"]').send_keys('2019xxxxxx')
        # 定位到密码输入框
        sleep(1)
        web.find_element(By.XPATH, '//*[@id="pwd"]')
        # 输入密码
        k = PyKeyboard()
        k.tap_key(k.tab_key)
        k.tap_key(k.numpad_keys[2], n=2)
        k.tap_key(k.numpad_keys[3])
        k.tap_key(k.numpad_keys[x])
        k.tap_key(k.numpad_keys[x])
        k.tap_key(k.numpad_keys[x])
        # 选择需要的网络类型
        k.tap_key(k.tab_key)
        sleep(1.5)
        web.find_element(By.XPATH, '//*[@id="_service_1"]').click()
        sleep(1)
        # 鼠标定位到登录按钮
        move = web.find_element(By.XPATH, '//*[@id="loginLink_div"]')
        selenium.webdriver.ActionChains(web).move_to_element(move).perform()
        web.execute_script("$(arguments[0]).click()", move)
        web.quit()
        notification.notify(
            title="校园网连接",
            message="校园网认证成功,请开始使用",
            timeout=5
        )
    else:
        web.quit()
        notification.notify(
            title="校园网连接",
            message="校园网已经认证、无需再次连接",
            timeout=5
        )
    # pyinstaller -F -w login_edge_2019223684.py --hidden-import plyer.platforms.win.notification

    运行结果及报错内容

    无头浏览器运行时:密码输入回了原代码区域,连接失败


    报错信息
    1. Traceback (most recent call last):
    2.   File "D:/software_workspace/python_workspace/稀奇古怪/校园网/login_chrome_2019223684plus.py", line 54, in <module>
    3.     web.find_element(By.XPATH, '//*[@id="_service_1"]').click()
    4.   File "C:\Users\21145\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1253, in find_element
    5.     'value': value})['value']
    6.   File "C:\Users\21145\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute
    7.     self.error_handler.check_response(response)
    8.   File "C:\Users\21145\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    9.     raise exception_class(message, screen, stacktrace)
    10. selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="_service_1"]"}
    11.   (Session info: headless chrome=102.0.5005.115)
    12. Stacktrace:
    13. Backtrace:
    14.     Ordinal0 [0x0041D953+2414931]
    15.     Ordinal0 [0x003AF5E1+1963489]
    16.     Ordinal0 [0x0029C6B8+837304]
    17.     Ordinal0 [0x002C9500+1021184]
    18.     Ordinal0 [0x002C979B+1021851]
    19.     Ordinal0 [0x002F6502+1205506]
    20.     Ordinal0 [0x002E44E4+1131748]
    21.     Ordinal0 [0x002F4812+1198098]
    22.     Ordinal0 [0x002E42B6+1131190]
    23.     Ordinal0 [0x002BE860+976992]
    24.     Ordinal0 [0x002BF756+980822]
    25.     GetHandleVerifier [0x0068CC62+2510274]
    26.     GetHandleVerifier [0x0067F760+2455744]
    27.     GetHandleVerifier [0x004AEABA+551962]
    28.     GetHandleVerifier [0x004AD916+547446]
    29.     Ordinal0 [0x003B5F3B+1990459]
    30.     Ordinal0 [0x003BA898+2009240]
    31.     Ordinal0 [0x003BA985+2009477]
    32.     Ordinal0 [0x003C3AD1+2046673]
    33.     BaseThreadInitThunk [0x776FFA29+25]
    34.     RtlGetAppContainerNamedObjectPath [0x77DB7A7E+286]
    35.     RtlGetAppContainerNamedObjectPath [0x77DB7A4E+238]
    复制代码

    我尝试更改过定位的方法,比如xpath全路径,也修改过代码sleep()的时间,也尝试过用tab和上下方位键定位服务,但是都失败告终,不理解为什么加了无头浏览器后,密码就输入不对了,诚挚请教各位,问题的原因,还望不吝赐教

    我想要达到的结果

    在无头浏览器的情况下,能够达到登录效果



    附件: 您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 1521 天

    连续签到: 5 天

    [LV.Master]测试大本营

    2#
    发表于 2022-6-22 12:00:58 | 只看该作者
    输入框定位不对
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    24 分钟前
  • 签到天数: 669 天

    连续签到: 1 天

    [LV.9]测试副司令

    3#
    发表于 2022-6-22 14:16:14 | 只看该作者
    不太清楚
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 2819 天

    连续签到: 1 天

    [LV.Master]测试大本营

    4#
    发表于 2022-6-22 15:21:16 | 只看该作者
    定位的不对?
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 09:27 , Processed in 0.068695 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表