如何在Playwright中使用Windows身份验证进行身份验证

huangapple go评论82阅读模式
英文:

How to authenticate using Windows Authentication in Playwright

问题

需要自动化一个使用Windows身份验证的测试。

我知道打开的提示框不是HTML页面的一部分,但为什么我的代码不起作用:

login_page.click_iwa()
sleep(5)
self.page.keyboard.type('用户名')
sleep(5)
self.page.keyboard.press('Tab')
self.page.keyboard.type('密码')
英文:

I need to automate a test that uses Windows Authentication.

I know that the the prompt that opens up is not part of the HTML page, yet why my code is not working:

login_page.click_iwa()
sleep(5)
self.page.keyboard.type('UserName')
sleep(5)
self.page.keyboard.press('Tab')
self.page.keyboard.type('Password')

答案1

得分: 2

我通过使用虚拟键盘来解决了这个问题:

from pyautogui import press, typewrite, hotkey


def press_key(key):
    press(key)


def type_text(text):
    typewrite(text)


def special_keys(special, normal):
    hotkey(special, normal)

然后,在我实现了虚拟键盘之后,我做了这个:

def login_iwa(self, user_name='User321', password='123456', need_to_fail=False):
    pyautogui.FAILSAFE = False
    self.click_iwa()
    sleep(7)
    type_text(user_name)
    sleep(1)
    press_key('Tab')
    sleep(1)
    type_text(password)
    sleep(1)
    press_key('Enter')
    sleep(2)
    if need_to_fail:
        press_key('Tab')
        sleep(1)
        press_key('Tab')
        sleep(1)
        press_key('Tab')
        sleep(1)
        press_key('Enter')
        sleep(1)

我将 pyautogui.FAILSAFE 设置为 False,因为有时弹出窗口会隐藏在屏幕后面或在第二个屏幕上打开。

英文:

I solved the issue by using a virtual keyboard:

from pyautogui import press, typewrite, hotkey


def press_key(key):
    press(key)


def type_text(text):
    typewrite(text)


def special_keys(special, normal):
    hotkey(special, normal)

Then, after I implemented the virtual keyboard, I did this:

def login_iwa(self, user_name='User321', password='123456', need_to_fail=False):
        pyautogui.FAILSAFE = False
        self.click_iwa()
        sleep(7)
        type_text(user_name)
        sleep(1)
        press_key('Tab')
        sleep(1)
        type_text(password)
        sleep(1)
        press_key('Enter')
        sleep(2)
        if need_to_fail:
            press_key('Tab')
            sleep(1)
            press_key('Tab')
            sleep(1)
            press_key('Tab')
            sleep(1)
            press_key('Enter')
            sleep(1)

I used pyautogui.FAILSAFE = False because sometime the popup was hiding behind the screen or was openning up on the 2nd screen.

答案2

得分: -2

我建议使用更多基于协议的方法。我已经测试了以下方法来使用用户名和密码设置为admin进行身份验证,所有方法都成功。下面是每种方法的完整代码,以便您可以简单地复制粘贴进行测试:

  1. 在URL中传递凭据:
from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto(url="http://admin:admin@the-internet.herokuapp.com/basic_auth")
    context.close()
    browser.close()
  1. 将凭据传递给http_credentials上下文参数:
from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context(
        http_credentials={
            "username": "admin",
            "password": "admin"
        }
    )
    page = context.new_page()
    page.goto(url="http://the-internet.herokuapp.com/basic_auth")
    context.close()
    browser.close()
  1. 使用Authorization HTTP头(然而,还有其他身份验证类型):
import base64
from playwright.sync_api import sync_playwright

def generate_basic_authentication_header_value(username: str, password: str) -> str:
    token = base64.b64encode("{}:{}".format(username, password).encode("utf-8")).decode("ascii")
    return "Basic {}".format(token)

with sync_playwright() as playwright:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context(
        extra_http_headers={
            "Authorization": generate_basic_authentication_header_value("admin", "admin"),
        }
    )
    page = context.new_page()
    page.goto(url="http://the-internet.herokuapp.com/basic_auth")
    context.close()
    browser.close()
英文:

I recommend using more protocol-based approaches. I have tested the following methods to authenticate using the the-internet.herokuapp.com/basic_auth endpoint with the username and password set to admin, and all of them worked successfully. Below, you'll find the complete code for each method to make it easy to test them by simply copy-pasting:

  1. Passing the credentials in the URL:

     from playwright.sync_api import sync_playwright
    
     with sync_playwright() as playwright:
         browser = playwright.chromium.launch(headless=False)
         context = browser.new_context()
         page = context.new_page()
         page.goto(url="http://admin:admin@the-internet.herokuapp.com/basic_auth")
         context.close()
         browser.close()
    
  2. Passing the credentials to the http_credentials context parameter:

     from playwright.sync_api import sync_playwright
    
     with sync_playwright() as playwright:
         browser = playwright.chromium.launch(headless=False)
         context = browser.new_context(
             http_credentials={
                 "username": "admin",
                 "password": "admin"
             }
         )
         page = context.new_page()
         page.goto(url="http://the-internet.herokuapp.com/basic_auth")
         context.close()
         browser.close()
    
  3. Using the Authorization HTTP header (however, there are other authentication types):

     import base64
     from playwright.sync_api import sync_playwright
    
     def generate_basic_authentication_header_value(username: str, password: str) -> str:
         token = base64.b64encode("{}:{}".format(username, password).encode("utf-8")).decode("ascii")
         return "Basic {}".format(token)
    
     with sync_playwright() as playwright:
         browser = playwright.chromium.launch(headless=False)
         context = browser.new_context(
             extra_http_headers={
                 "Authorization": generate_basic_authentication_header_value("admin", "admin"),
             }
         )
         page = context.new_page()
         page.goto(url="http://the-internet.herokuapp.com/basic_auth")
         context.close()
         browser.close()
    

huangapple
  • 本文由 发表于 2023年6月26日 20:30:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/76556703.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定