python-3.x Selenium处理“@”字符非常奇怪

xxe27gdn  于 2023-01-27  发布在  Python
关注(0)|答案(3)|浏览(161)

我尝试在python中使用Selenium,在正常和headless浏览器模式下使用标准和undetected_chrome驱动程序。我注意到一些奇怪的行为:

  • 正常chrome驱动程序在使用send_keys()函数将键发送到HTML输入字段时,可以正常使用特殊输入
      • undetected_chrome驱动程序**无法很好地处理send_keys()函数的特殊输入
  • 正常浏览器模式下,如果我将电子邮件地址发送到HTML输入字段(如"abc@xyz.com")中,剪贴板中的当前内容将粘贴到"@"字符的位置
  • 例如:如果我最后一次复制了字符串"123",则输入的电子邮件地址将不是"abc@xyz.com",而是"abc123xyz.com",这显然是不正确的
  • 这就是为什么我使用一个变通方法,即在send_keys()函数运行之前导入pyperclip并将"@"字符放到剪贴板中,以便正确地将"@"字符替换为"@"字符
  • headless浏览器模式下,如果我在HTML输入字段中输入电子邮件地址,如"abc@xyz.com",我的解决方法不再重要,"@"字符将从电子邮件中删除,"abcxyz.com"字符串将放入字段中

我认为默认情况下发送一个"@"字符应该不难。我在这里做错了什么吗?

    • 问题**:
  • 有人能解释这些奇怪的行为吗?
  • 我如何在无头浏览器模式下正确发送电子邮件地址?(我需要使用undetected_chrome驱动程序,因为机器人)
from selenium import webdriver

self.chrome_options = webdriver.ChromeOptions()
if self.headless:
    self.chrome_options.add_argument('--headless')
    self.chrome_options.add_argument('--disable-gpu')

prefs = {'download.default_directory' : os.path.realpath(self.download_dir_path)}
self.chrome_options.add_experimental_option('prefs', prefs)
self.driver = webdriver.Chrome(options=self.chrome_options)
import undetected_chromedriver as uc

# workaround for problem with pasting text from the clipboard into '@' symbol when using send_keys()
import pyperclip
pyperclip.copy('@')  #  <---- THIS IS THE WORKAROUND FOR THE PASTING PROBLEM

self.chrome_options = uc.ChromeOptions()
if self.headless:
    self.chrome_options.add_argument('--headless')
    self.chrome_options.add_argument('--disable-gpu')
self.driver = uc.Chrome(options=self.chrome_options)

params = {
    "behavior": "allow",
    "downloadPath": os.path.realpath(self.download_dir_path)
}
self.driver.execute_cdp_cmd("Page.setDownloadBehavior", params)

我使用的requirements.txt版本:

selenium==4.3.0
undetected-chromedriver==3.1.5.post4
vybvopom

vybvopom1#

不要使用自定义配置选项,而是先尝试一个更基本的变体,看看是否工作正常。然后找出哪个选项组合导致了这个问题。
一个例子(顺便说一句,它确实能正确工作)

import undetected_chromedriver as uc
from selenium.webdriver.common.by import By

driver = uc.Chrome()

driver.execute_script("""

    document.documentElement.innerHTML = `

        <!DOCTYPE html>
        <html lang="en">
        <head>

            <meta charset="UTF-8">

            <meta http-equiv="X-UA-Compatible" content="IE=edge">

            <meta name="viewport" content="width=device-width, initial-scale=1.0">

            <title>Document</title>

            <style>

                html, body, main {

                    height: 100%;

                }

                main {

                    display: flex;

                    justify-content: center;

                }

            </style>

        </head>

        <body>

            <main>

                <form>

                    <input type="text" name="text" />

                    <input type="email" name="email"/>

                    <input type="tel" name="tel"/>

                </form>

            </main>

        </body>

        </html>`
    """)


driver.find_element(By.NAME, "text").send_keys("info@example.com")
driver.find_element(By.NAME, "email").send_keys("info@example.com")
driver.find_element(By.NAME, "tel").send_keys("info@example.com")
mqkwyuun

mqkwyuun2#

这个抱怨(输入“@”粘贴剪贴板内容)不时出现在这里,但我从来没有看到一个明确的解决方案。我怀疑一个特定语言版本的Windows和/或键盘驱动程序。

rjjhvcjd

rjjhvcjd3#

Windows语言是问题所在,更准确地说是键盘布局,因为它会根据语言而变化。将其切换到“ENG”,它应该工作正常。字母Z在“T”和“U”之间的键盘布局在未检测到的驱动程序中不工作。Z在“X”旁边的键盘布局工作正常。

相关问题