Selenium Chrome驱动选择证书弹出确认不起作用

16

我正在使用 Selenium Chromewebdriver 3.7 自动化测试。每次打开网站时,都会弹出证书选择弹窗,如下所示enter image description here

然而,我无法点击“确定”按钮。这些是我尝试过的选项。

 //I have tried getWindowHandle like this  
 String  handle= driver.getWindowHandle();
        this.driver.switchTo().window(handle);

//I have alos tried switching and accept
 driver.switchTo().alert().accept();

//I have also tried to force the enter key like this
 robot.keyPress(KeyEvent.VK_ENTER);
 robot.keyRelease(KeyEvent.VK_ENTER);

 // I also tried this way
 Scanner keyboard = new Scanner(System.in);
 keyboard.nextLine();

我所有的尝试都失败了。我怎样才能在这个弹出窗口上点击“确定”? 这是我找到的最接近的解决方案,但它并没有起作用。链接在此

5个回答

9

我也遇到了使用签名证书时无法接受警告的问题。@eskoba的解决方案非常有效。这些函数并不是最终版本,因为我让回车键按了10次。我之所以这样做,是因为webdriver需要很长时间才能实际调用url。与此同时,他已经开始按下按键了。

在Python中:

def threaded_function():
    #Calls the website
    browser.get(url)

def threaded_function2():
    #Presses 10 times
    for i in range(0,10):
        pyautogui.press('enter')

#Calling the website and pressing 10 times in the same time
thread2 = Thread(target = threaded_function2)
thread2.start()

thread = Thread(target = threaded_function)
thread.start()

1
很棒的答案!为了更清晰明确,一些重要的导入如下:import threading import pyautogui 然后定义一个浏览器,即 browser = webdriver.Chrome(executable_path = 'chromedriver.exe PATH');然后你就可以把上面的代码投入使用了。在这里再补充一点,你可以在 threaded_function2 中加入 time.sleep(10),这样它会允许例如 10 秒的时间来加载 URL。 - Gin

5
如果问题仍然存在,我在 Mac 上也遇到了同样的问题,解决方法很简单:
  • for chrome is set AutoSelectCertificateForUrls policy like that:

    defaults write com.google.Chrome AutoSelectCertificateForUrls -array-add -string '{"pattern":"[*.]example.com","filter":{"ISSUER":{"CN":"**cert issuer**"}, "SUBJECT":{"CN": "**cert name**"}}}'
    
  • for safari:

    security set-identity-preference -c "**cert name**" -s "**example.com**"
    

然后在代码中使用它,例如在Python中使用subprocess.call()


该策略也可以通过注册表和其他方法在多个操作系统中启用。请参阅策略文档 https://www.chromium.org/administrators/policy-list-3#AutoSelectCertificateForUrls - Alexey Kuptsov
这是我在 .reg 文件中的配置方式:[HKEY_CURRENT_USER\SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls] "1"="{\"pattern\":\"https://example.com\",\"filter\":{\"ISSUER\":{\"CN\":\"example.com\"}, \"SUBJECT\":{\"CN\":\"Alex McSubjectUser\"}}}" - Alexey Kuptsov

1

我曾经遇到同样的问题,通过使用机器人,创建URL函数并将其传递给不同的线程,最终解决了这个问题。

    Runnable mlauncher = () -> {
    try {

      driver.get(url);
     } catch (Exception e) {
          e.printStackTrace();
       }
    };

public void myfunction {
 try {

   Thread mthread = new Thread(mlauncher);
   mthread.start

  robot.keyPress(KeyEvent.VK_ENTER);
  robot.keyRelease(KeyEvent.VK_ENTER);

 } catch (Exception e) {
          e.printStackTrace();
       }

1
你能解释一下这个调用的流程吗? - deepak
糟糕,Robot类来自AWT。 - Jonathan Benn
1
目前看来,答案“AutoSelectCertificateForUrls”更为实际。 - Alexey Kuptsov
如果我们想在测试中使用不同的证书,那么AutoSelectCertificateForUrls似乎不是一个好选择。也许在运行浏览器之前,在测试期间动态更改AutoSelectCertificateForUrls的值可能是一个解决方法?但是,我担心这可能需要更高的用户权限来编辑注册表。 - matandked
我已经尝试了相同的方法,在基于Windows的Chrome上运行成功,但在我的Docker Chrome镜像上失败了。是否需要做任何不同的事情? - RISHI KHANNA
显示剩余2条评论

0

一个建议是,使用Sikuli来点击证书中的“确定”按钮。

步骤:

  1. 截取“确定”按钮的屏幕截图并保存。
  2. 下载sikuli-script.jar并将其添加到项目的构建路径中。
  3. 截取要单击的UI元素的屏幕截图并在本地保存。
  4. 将以下代码添加到测试用例中。

    Screen s=new Screen(); s.click(“image name”);

Sikuli提供的其他功能可以在这里找到。


-2

当证书缺失、无效或自签名时,您也可以跳过提示。

您需要在创建驱动程序实例时设置DesiredCapabilities中的acceptInsecureCerts并将其传递。

例如,在Python中:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities.CHROME.copy()
caps['acceptInsecureCerts'] = True
driver = webdriver.Chrome(desired_capabilities=caps)

1
你的解决方案不正确,因为它没有针对这个具体的问题。你想要绕过浏览器不安全证书的警告,但是@user4237435所问的是如何绕过警告并使用签名证书。你的解决方案只是让警告消失了:https://www.veterinaryha.org/images/2018/Blog/June/non-secure-http-warning-message.png - chainstair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接