测试积点老人 发表于 2022-6-21 10:43:17

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

我在使用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, n=2)
    k.tap_key(k.numpad_keys)
    k.tap_key(k.numpad_keys)
    k.tap_key(k.numpad_keys)
    k.tap_key(k.numpad_keys)
    # 选择需要的网络类型
    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).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, n=2)
    k.tap_key(k.numpad_keys)
    k.tap_key(k.numpad_keys)
    k.tap_key(k.numpad_keys)
    k.tap_key(k.numpad_keys)
    # 选择需要的网络类型
    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).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
运行结果及报错内容无头浏览器运行时:密码输入回了原代码区域,连接失败

报错信息
Traceback (most recent call last):
File "D:/software_workspace/python_workspace/稀奇古怪/校园网/login_chrome_2019223684plus.py", line 54, in <module>
    web.find_element(By.XPATH, '//*[@id="_service_1"]').click()
File "C:\Users\21145\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1253, in find_element
    'value': value})['value']
File "C:\Users\21145\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute
    self.error_handler.check_response(response)
File "C:\Users\21145\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="_service_1"]"}
(Session info: headless chrome=102.0.5005.115)
Stacktrace:
Backtrace:
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    GetHandleVerifier
    GetHandleVerifier
    GetHandleVerifier
    GetHandleVerifier
    Ordinal0
    Ordinal0
    Ordinal0
    Ordinal0
    BaseThreadInitThunk
    RtlGetAppContainerNamedObjectPath
    RtlGetAppContainerNamedObjectPath 我尝试更改过定位的方法,比如xpath全路径,也修改过代码sleep()的时间,也尝试过用tab和上下方位键定位服务,但是都失败告终,不理解为什么加了无头浏览器后,密码就输入不对了,诚挚请教各位,问题的原因,还望不吝赐教我想要达到的结果在无头浏览器的情况下,能够达到登录效果

qqq911 发表于 2022-6-22 12:00:58

输入框定位不对

kallinr 发表于 2022-6-22 14:16:14

不太清楚

jingzizx 发表于 2022-6-22 15:21:16

定位的不对?
页: [1]
查看完整版本: 无头浏览器下pykeyboard模拟输入密码时,密码错误输入回了Python原代码区域