虚拟身份验证器
一种Web身份验证器模型的表示形式.
Web 应用程序可以启用基于公钥的身份验证机制(称为 Web 身份验证)以无密码方式对用户进行身份验证。 Web 身份验证 定义了允许用户创建公钥凭据并将其注册到身份验证器的 API。 身份验证器可以是硬件设备或软件实体,用于存储用户的公钥凭证并根据请求检索它们。
顾名思义,虚拟身份验证器模拟此类身份验证器进行测试。
虚拟身份验证器选项
虚拟身份验证器具有 一组属性。 这些属性在 Selenium 绑定中映射为 VirtualAuthenticatorOptions。
  public void testVirtualOptions() {
    VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
      .setIsUserVerified(true)
      .setHasUserVerification(true)
      .setIsUserConsenting(true)
      .setTransport(VirtualAuthenticatorOptions.Transport.USB)
      .setProtocol(VirtualAuthenticatorOptions.Protocol.U2F)            // Create virtual authenticator options
            VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
                .SetIsUserVerified(true)
                .SetHasUserVerification(true)
                .SetIsUserConsenting(true)
                .SetTransport(VirtualAuthenticatorOptions.Transport.USB)
                .SetProtocol(VirtualAuthenticatorOptions.Protocol.U2F)
                .SetHasResidentKey(false);    options = VirtualAuthenticatorOptions()
    options.is_user_verified = True
    options.has_user_verification = True
    options.is_user_consenting = True
    options.transport = VirtualAuthenticatorOptions.Transport.USB
    options.protocol = VirtualAuthenticatorOptions.Protocol.U2F
    options.has_resident_key = False    options.setHasUserVerification(true);
    options.setIsUserConsenting(true);
    options.setTransport(Transport['USB']);
    options.setProtocol(Protocol['U2F']);
    options.setHasResidentKey(false);
    assert(Object.keys(options).length === 6);添加虚拟身份验证器
它使用提供的属性创建一个新的虚拟身份验证器。
  public void testCreateAuthenticator() {
    VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
      .setProtocol(VirtualAuthenticatorOptions.Protocol.U2F)
      .setHasResidentKey(false);
    VirtualAuthenticator authenticator =            // Create virtual authenticator options
            VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
                .SetProtocol(VirtualAuthenticatorOptions.Protocol.U2F)
                .SetHasResidentKey(false);
            // Register a virtual authenticator
            ((WebDriver)driver).AddVirtualAuthenticator(options);
            List<Credential> credentialList = ((WebDriver)driver).GetCredentials();    options = VirtualAuthenticatorOptions()
    options.protocol = VirtualAuthenticatorOptions.Protocol.U2F
    options.has_resident_key = False
    # Register a virtual authenticator
    driver.add_virtual_authenticator(options)    options.setProtocol(Protocol['U2F']);
    options.setHasResidentKey(false);
    // Register a virtual authenticator
    await driver.addVirtualAuthenticator(options);删除虚拟身份验证器
删除之前添加的虚拟身份验证器。
            VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
                .SetProtocol(VirtualAuthenticatorOptions.Protocol.U2F)
                .SetHasResidentKey(false);
            String virtualAuthenticatorId = ((WebDriver)driver).AddVirtualAuthenticator(options);
            ((WebDriver)driver).RemoveVirtualAuthenticator(virtualAuthenticatorId);    options = VirtualAuthenticatorOptions()
    # Register a virtual authenticator
    driver.add_virtual_authenticator(options)
    # Remove virtual authenticator
    driver.remove_virtual_authenticator()    await driver.addVirtualAuthenticator(options);
    await driver.removeVirtualAuthenticator();创建永久凭据
使用给定的所需凭据 参数 创建一个永久(有状态的)凭据。
    byte[] credentialId = {1, 2, 3, 4};
    byte[] userHandle = {1};
    Credential residentCredential = Credential.createResidentCredential(            byte[] credentialId = { 1, 2, 3, 4 };
            byte[] userHandle = { 1 };
            Credential residentCredential = Credential.CreateResidentCredential(
              credentialId, "localhost", base64EncodedPK, userHandle, 0);    # parameters for Resident Credential
    credential_id = bytearray({1, 2, 3, 4})
    rp_id = "localhost"
    user_handle = bytearray({1})
    privatekey = urlsafe_b64decode(BASE64__ENCODED_PK)
    sign_count = 0
    # create a resident credential using above parameters
    resident_credential = Credential.create_resident_credential(credential_id, rp_id, user_handle, privatekey, sign_count)    options.setProtocol(Protocol['CTAP2']);
    options.setHasResidentKey(true);
    options.setHasUserVerification(true);
    options.setIsUserVerified(true);
    await driver.addVirtualAuthenticator(options);
    let residentCredential = new Credential().createResidentCredential(
      new Uint8Array([1, 2, 3, 4]),
      'localhost',
      new Uint8Array([1]),
      Buffer.from(BASE64_ENCODED_PK, 'base64').toString('binary'),
      0);
    await driver.addCredential(residentCredential);创建临时凭据
使用给定的所需凭据 参数 创建一个常驻(无状态)凭据。
    VirtualAuthenticator authenticator = ((HasVirtualAuthenticator) driver).addVirtualAuthenticator(options);
    byte[] credentialId = {1, 2, 3, 4};            byte[] credentialId = { 1, 2, 3, 4 };
            Credential nonResidentCredential = Credential.CreateNonResidentCredential(
              credentialId, "localhost", base64EncodedEC256PK, 0);    # parameters for Non Resident Credential
    credential_id = bytearray({1, 2, 3, 4})
    rp_id = "localhost"
    privatekey = urlsafe_b64decode(BASE64__ENCODED_PK)
    sign_count = 0
    # create a non resident credential using above parameters
    credential = Credential.create_non_resident_credential(credential_id, rp_id, privatekey, sign_count)    let nonResidentCredential = new Credential().createNonResidentCredential(
      new Uint8Array([1, 2, 3, 4]),
      'localhost',
      Buffer.from(base64EncodedPK, 'base64').toString('binary'),
      0);添加凭据
向身份验证器注册凭据。
  @Disabled("A fix was implemented and will be available in Selenium 4.34.")
  public void testCreateAndAddNonResidentialKey() {
    VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
      .setProtocol(VirtualAuthenticatorOptions.Protocol.U2F)
      .setHasResidentKey(false);
    VirtualAuthenticator authenticator = ((HasVirtualAuthenticator) driver).addVirtualAuthenticator(options);
    byte[] credentialId = {1, 2, 3, 4};
    Credential nonResidentCredential = Credential.createNonResidentCredential(            VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
                .SetProtocol(VirtualAuthenticatorOptions.Protocol.U2F)
                .SetHasResidentKey(false);
            ((WebDriver)driver).AddVirtualAuthenticator(options);
            byte[] credentialId = { 1, 2, 3, 4 };
            Credential nonResidentCredential = Credential.CreateNonResidentCredential(
              credentialId, "localhost", base64EncodedEC256PK, 0);
            ((WebDriver)driver).AddCredential(nonResidentCredential);    driver.add_credential(credential)    options.setProtocol(Protocol['U2F']);
    options.setHasResidentKey(false);
    await driver.addVirtualAuthenticator(options);
    let nonResidentCredential = new Credential().createNonResidentCredential(
      new Uint8Array([1, 2, 3, 4]),
      'localhost',
      Buffer.from(base64EncodedPK, 'base64').toString('binary'),
      0);
    await driver.addCredential(nonResidentCredential);获取凭据
返回身份验证者拥有的凭据列表。
  @Test
  public void testGetCredential() {
    VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
      .setProtocol(VirtualAuthenticatorOptions.Protocol.CTAP2)
      .setHasResidentKey(true)
      .setHasUserVerification(true)
      .setIsUserVerified(true);
    VirtualAuthenticator authenticator = ((HasVirtualAuthenticator) driver).addVirtualAuthenticator(options);
    byte[] credentialId = {1, 2, 3, 4};
    byte[] userHandle = {1};
    Credential residentCredential = Credential.createResidentCredential(
      credentialId, "localhost", rsaPrivateKey, userHandle, /*signCount=*/0);
    authenticator.addCredential(residentCredential);            VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
                .SetProtocol(Protocol.CTAP2)
                .SetHasResidentKey(true)
                .SetHasUserVerification(true)
                .SetIsUserVerified(true);
            ((WebDriver)driver).AddVirtualAuthenticator(options);
            byte[] credentialId = { 1, 2, 3, 4 };
            byte[] userHandle = { 1 };
            Credential residentCredential = Credential.CreateResidentCredential(
              credentialId, "localhost", base64EncodedPK, userHandle, 0);
            ((WebDriver)driver).AddCredential(residentCredential);
            List<Credential> credentialList = ((WebDriver)driver).GetCredentials();    credential_list = driver.get_credentials()    options.setProtocol(Protocol['CTAP2']);
    options.setHasResidentKey(true);
    options.setHasUserVerification(true);
    options.setIsUserVerified(true);
    await driver.addVirtualAuthenticator(options);
    let residentCredential = new Credential().createResidentCredential(
      new Uint8Array([1, 2, 3, 4]),
      'localhost',
      new Uint8Array([1]),
      Buffer.from(BASE64_ENCODED_PK, 'base64').toString('binary'),
      0);
    await driver.addCredential(residentCredential);
    let credentialList = await driver.getCredentials();删除凭据
根据传递的凭据ID从身份验证器中删除凭据。
            ((WebDriver)driver).AddVirtualAuthenticator(new VirtualAuthenticatorOptions());
            byte[] credentialId = { 1, 2, 3, 4 };
            Credential nonResidentCredential = Credential.CreateNonResidentCredential(
              credentialId, "localhost", base64EncodedEC256PK, 0);
            ((WebDriver)driver).AddCredential(nonResidentCredential);
            ((WebDriver)driver).RemoveCredential(credentialId);  @Test
  public void testRemoveCredential() {
    VirtualAuthenticator authenticator =
      ((HasVirtualAuthenticator) driver).addVirtualAuthenticator(new VirtualAuthenticatorOptions());
    byte[] credentialId = {1, 2, 3, 4};
    Credential credential = Credential.createNonResidentCredential(
      credentialId, "localhost", rsaPrivateKey, 0);
    authenticator.addCredential(credential);    driver.remove_credential(credential.id)删除所有凭据
从身份验证器中删除所有凭据。
  @Test
  public void testRemoveAllCredentials() {
    VirtualAuthenticator authenticator =
      ((HasVirtualAuthenticator) driver).addVirtualAuthenticator(new VirtualAuthenticatorOptions());
    byte[] credentialId = {1, 2, 3, 4};
    Credential residentCredential = Credential.createNonResidentCredential(
      credentialId, "localhost", rsaPrivateKey, /*signCount=*/0);
    authenticator.addCredential(residentCredential);            ((WebDriver)driver).AddVirtualAuthenticator(new VirtualAuthenticatorOptions());
            byte[] credentialId = { 1, 2, 3, 4 };
            Credential nonResidentCredential = Credential.CreateNonResidentCredential(
              credentialId, "localhost", base64EncodedEC256PK, 0);
            ((WebDriver)driver).AddCredential(nonResidentCredential);
            ((WebDriver)driver).RemoveAllCredentials();    driver.remove_all_credentials()    await driver.addVirtualAuthenticator(options);
    let nonResidentCredential = new Credential().createNonResidentCredential(
      new Uint8Array([1, 2, 3, 4]),
      'localhost',
      Buffer.from(BASE64_ENCODED_PK, 'base64').toString('binary'),
      0);
    await driver.addCredential(nonResidentCredential);
    await driver.removeAllCredentials();设置用户验证状态
设置身份验证器是模拟用户验证成功还是失败。
  @Test
  public void testSetUserVerified() {            VirtualAuthenticatorOptions options = new VirtualAuthenticatorOptions()
                .SetIsUserVerified(true);    # Create virtual authenticator options
    options = VirtualAuthenticatorOptions()
    options.is_user_verified = True    options.setIsUserVerified(true);



