Ki2neudon
@Ki2neudon

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Python3】Selenium4 でProxyが突破できない(Edge)

解決したいこと

社内Proxyが掛かっている環境でSelenium4を利用してEdgeを操作したいと考えています。
しかしwebdriver.Edge()にてProxy周りのエラーが出ているように見えます。
解決方法をご存知、もしくは解決に至るヒントをお持ちの方が居ましたらコメントをお願いします。

そもそも出力されているエラーに対して「これはPROXYの問題じゃないよ」というのも大歓迎です。

環境準備

Windows PowershellでPythonの仮想環境を作成

PS > python -m venv venv-hoge

仮想環境を起動して必要なパッケージをインストール

PS > cd venv-hoge\Scripts
PS > .\Activate.ps1
(venv) > python -m pip install --upgrade pip
(venv) > pip install selenium
(venv) > pip install webdriver-manager

環境確認

(venv) > python --version
Python 3.10.0
(venv) > python
>>> import selenium
>>> help(selenium)
: 省略
VERSION
    4.2.0

該当するソースコード

hoge.py
# coding: utf-8
import os
from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options

# ブラウザの最新ドライバを%USERPROFILE%\SeleniumWebDriverに配置
driverDir = os.environ['USERPROFILE'] + "\\SeleniumWebDriver\\"
# フォルダが無ければ作成
if not os.path.exists(driverDir):
    os.makedirs(driverDir)
# ドライバ配置
driverPath = EdgeChromiumDriverManager(path=driverDir).install()

# ドライバパスをserviceで渡す準備
service = Service(executable_path=driverPath)

# ドライバの立ち上げ
driver = webdriver.Edge(service=service)

実行結果(発生しているエラー)

(venv) > python hoge.py

[WDM] - ====== WebDriver manager ======
[WDM] - Current edge version is 102.0.1245
[WDM] - Get LATEST edgedriver version for 102.0.1245 Edge
[WDM] - Driver [C:\Users\(ユーザ名)\SeleniumWebDriver\.wdm\drivers\edgedriver\win64\102.0.1245.39\msedgedriver.exe] found in cache
Traceback (most recent call last):
  File "C:\(仮想環境作成場所)\venv-hoge\package\hoge.py", line 20, in <module>
    driver = webdriver.Edge(service=service)
  File "C:\(仮想環境作成場所)\venv-hoge\lib\site-packages\selenium\webdriver\edge\webdriver.py", line 62, in __init__
    super(WebDriver, self).__init__(DesiredCapabilities.EDGE['browserName'], "ms",
  File "C:\(仮想環境作成場所)\venv-hoge\lib\site-packages\selenium\webdriver\chromium\webdriver.py", line 92, in __init__
    RemoteWebDriver.__init__(
  File "C:\(仮想環境作成場所)\venv-hoge\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 275, in __init__
    self.start_session(capabilities, browser_profile)
  File "C:\(仮想環境作成場所)\venv-hoge\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 365, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "C:\(仮想環境作成場所)\venv-hoge\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute
    self.error_handler.check_response(response)
  File "C:\(仮想環境作成場所)\venv-hoge\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 211, in check_response
    raise exception_class(value)
selenium.common.exceptions.WebDriverException: Message: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<!-- FileName: index.html
     Language: [en]
-->
<!--Head-->
<head>
  <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  <meta http-equiv="X-UA-Compatible" content="IE=7" />
  <title>McAfee Web Gateway - Notification</title>
  <script src="/mwg-internal/de5fs23hu73ds/files/javascript/sw.js" type="text/javascript" ></script>
  <link rel="stylesheet" href="/mwg-internal/de5fs23hu73ds/files/default/stylesheet.css" />
</head>
<!--/Head-->
<!--Body-->
<body onload="swOnLoad();">
  <table class='bodyTable'>
    <tr>
      <td class='bodyData' background='/mwg-internal/de5fs23hu73ds/files/default/img/bg_body.gif'>
<!--Logo-->
<table class='logoTable'>
  <tr>
    <td class='logoData'>
      <a href='http://www.mcafee.com'>
        <img src='/mwg-internal/de5fs23hu73ds/files/default/img/logo_mwg.png'></a>
    </td>
  </tr>
</table>
<!--/Logo-->
<!--Contents-->
<!-- FileName: cannotconnect.html
     Language: [en]
-->
<!--Title-->
<table class='titleTable' background='/mwg-internal/de5fs23hu73ds/files/default/img/bg_navbar.jpg'>
  <tr>
    <td class='titleData'>
      Cannot Connect
    </td>
  </tr>
</table>
<!--/Title-->

<!--Content-->
<table class="contentTable">
  <tr>
    <td class="contentData">
      The proxy could not connect to the destination in time.
    </td>
  </tr>
</table>
<!--/Content-->

<!--Info-->
<table class="infoTable">
  <tr>
    <td class="infoData">
      <b>URL: </b><script type="text/javascript">break_line("http://localhost:53851/session");</script><br />
      <p class="proxyErrorData">Failure Description: :cannotconnect:server state 1:state 9:Application response 502 cannotconnect</p>
    </td>
  </tr>
</table>
<!--/Info-->

<!--/Contents-->
<!--Policy-->
<table class='policyTable'>
  <tr>
    <td class='policyHeading'>
      <hr>
      Company Acceptable Use Policy
    </td>
  </tr>
  <tr>
    <td class='policyData'>
      This is an optional acceptable use disclaimer that appears on every page. You may change the wording or remove this section entirely in index.html.
    </td>
  </tr>
</table>
<!--/Policy-->
<!--Foot-->
<table class='footTable'>
  <tr>
    <td class='helpDeskData' background='/mwg-internal/de5fs23hu73ds/files/default/img/bg_navbar.jpg'>
      For assistance, please contact your system administrator.
    </td>
  </tr>
  <tr>
    <td class='footData'>
      generated <span id="time">2022-06-14 18:59:51</span> by McAfee Web Gateway
      <br />
      selenium/4.2.0 (python windows)
    </td>
  </tr>
</table>
<!--/Foot-->
      </td>
    </tr>
  </table>
</body>
<!--/Body-->
</html>

HTML部分を.htmlに保存してブラウザで開いたイメージは以下
image.png

自分で試したこと

webdriver.DesiredCapabilities.EDGE['proxy']の指定

参考URL : Selenium - 日本語ドキュメント

# ドライバの立ち上げ以下を修正

# ドライバの立ち上げ
PROXY = "社内のプロキシサーバ:ポート番号"
webdriver.DesiredCapabilities.EDGE['proxy'] = {
"httpProxy": PROXY,
"ftpProxy": PROXY,
"sslProxy": PROXY,
"proxyType": "MANUAL",
}

driver = webdriver.Edge(service=service)

結果は変わらず。

Selenium3だった時

hoge3.py
# coding: utf-8
import os
from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from msedge.selenium_tools import Edge

# ブラウザの最新ドライバを%USERPROFILE%\SeleniumWebDriverに配置
driverDir = os.environ['USERPROFILE'] + "\\SeleniumWebDriver\\"
# フォルダが無ければ作成
if not os.path.exists(driverDir):
    os.makedirs(driverDir)
# ドライバ配置
driverPath = EdgeChromiumDriverManager(path=driverDir).install()

# ドライバの立ち上げ
driver = Edge(executable_path=driverPath)

これでブラウザを起動できている。

0

2Answer

当方の環境では、
環境変数名
no_proxy
変数値
127.0.0.1,localhost
を登録すると動きました。
質問日時から4か月経過していてすでに解決済みかもしれませんが、、

3Like

Comments

  1. @Ki2neudon

    Questioner

    1年ほど寝かせてしまい申し訳ないです。
    あれから色々調べたり試したりしまして、そもそもseleniumに認証付PROXYを突破する仕組みがなさそうでした。
    最終的にGoogleChromeの拡張機能を利用することで対処することにしました。

    参考:https://stackoverflow.com/questions/12848327/how-to-run-selenium-web-driver-behind-a-proxy-server-which-needs-authentication

    1. Chromeを起動
    2. Seleniumで1.をコントロール
    3. Proxy認証情報をGoogleChromeの拡張機能としてAdd

    ご協力ありがとうございました~

おー!ありがとうございます。まだ解決しておりません!
環境を崩してしまったので時間見つけて試してみます。質問を拾っていただいてありがとうございますー!

0Like

Your answer might help someone💌