当前位置: 首页 > 知识库问答 >
问题:

如何使用python为远程selenium webdrive配置特殊的代理设置?

李和裕
2023-03-14

我将从描述我正在工作的架构体系开始。它包含多个代理服务器,这些服务器使用负载均衡器将用户身份验证转发到直接绑定到活动目录的适当代理。身份验证使用用于登录请求来自的计算机的凭据和源IP。服务器将IP和凭据缓存60分钟。我正在使用专门用于此过程的测试帐户,并且仅在单元测试服务器上使用。

我正在使用docker容器在远程服务器上实现selenium webdriver的自动化。我使用python作为脚本语言。我试图在内部和外部网页/应用程序上运行测试。我能够通过以下脚本在一个内部网站上进行基本测试:

注意:10.1.54.118是带有selenium Web驱动程序的docker容器托管服务器

from selenium import webdriver

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

browser = webdriver.Remote(command_executor='http://10.1.54.118:4444/wd/hub', desired_capabilities=DesiredCapabilities.CHROME)
browser.get("http://10.0.0.2")

print (browser.find_element_by_tag_name('body').text)

bodyText = browser.find_element_by_tag_name('body').text

print (bodyText)
    
if 'Hello' in bodyText:
    print ('Found hello in body')
else:
    print ('Hello not found in body')

browser.quit()

脚本可以访问内部网页并打印上面的所有文本。

但是,我在尝试对外部网站运行测试脚本时遇到问题。

我已经尝试了以下文章和教程,它似乎不适合我。

我尝试过的文章和教程:

  • https://www.seleniumhq.org/docs/04_webdriver_advanced.jsp
  • 通过驱动程序ChromeOptions和所需的功能?
  • https://www.programcreek.com/python/example/100023/selenium.webdriver.Remote
  • https://github.com/webdriverio/webdriverio/issues/324
  • https://www.programcreek.com/python/example/96010/selenium.webdriver.common.desired_capabilities.DesiredCapabilities.CHROME
  • 在Python中使用代理运行Selenium WebDrive
  • 我如何设置在python Web驱动程序中的chrome代理
  • https://docs.proxymesh.com/article/4-python-proxy-configuration

我已经尝试创建了4个版本的脚本来访问外部网站,即google.com,并简单地将文本打印出来。每个脚本都返回一个超时错误。我为发布了很多代码道歉,但也许社区能够看到我在编码方面出了什么问题。

代码1:

from selenium import webdriver

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

PROXY = "10.32.51.169:3128" # IP:PORT or HOST:PORT
desired_capabilities = webdriver.DesiredCapabilities.CHROME.copy()

desired_capabilities['proxy'] = {
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "socksUsername":"myusername",
    "socksPassword":"mypassword",
    "noProxy":None,
    "proxyType":"MANUAL",
    "class":"org.openqa.selenium.Proxy",
    "autodetect":False
    }
browser = webdriver.Remote('http://10.1.54.118:4444/wd/hub', desired_capabilities)
browser.get("https://www.google.com/")

print (browser.find_element_by_tag_name('body').text)

bodyText = browser.find_element_by_tag_name('body').text

print (bodyText)
   
if 'Hello' in bodyText:
    print ('Found hello in body')
else:
    print ('Hello not found in body')

browser.quit()

我的代码在任何方面都是不正确的吗?我是否可以将配置参数传递给docker chrome selenium webDrive,或者我是否需要在构建docker容器之前预先配置代理设置?我期待您的回复和任何帮助,可以为我指明正确的方向。

共有1个答案

余靖
2023-03-14

这件事有点晚了,但有几个想法:

  1. 用户/通行证从袜子代理配置中删除,并将其添加到您的代理连接uri中。
  2. 使用selenium Proxy对象来帮助抽象代理功能的其他部分。
  3. 将方案添加到代理连接字符串中。
  4. 使用try/last块来确保浏览器在任何失败情况下都退出

笔记我使用的是Python3,selenium版本3.141.0,为了简洁,我省略了FTP配置:

from selenium import webdriver

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

# Note the addition of the scheme (http) and the user/pass into the connection string.    
PROXY = 'http://myusername:mypassword@10.32.51.169:3128'

# Use the selenium Proxy object to add proxy capabilities
proxy_config = {'httpProxy': PROXY, 'sslProxy': PROXY}
proxy_object = Proxy(raw=proxy_config)
capabilities = DesiredCapabilities.CHROME.copy()
proxy_object.add_to_capabilities(capabilities)

browser = webdriver.Remote('http://10.1.54.118:4444/wd/hub', desired_capabilities=capabilities)

# Use try/finally so the browser quits even if there is an exception
try:
    browser.get("https://www.google.com/")

    print(browser.find_element_by_tag_name('body').text)

    bodyText = browser.find_element_by_tag_name('body').text

    print(bodyText)

    if 'Hello' in bodyText:
        print('Found hello in body')
    else:
        print('Hello not found in body')
finally:
    browser.quit()
 类似资料:
  • 我们使用atlassian文档在一个服务器上安装了竹远程代理。我们已经批准了代理,它与竹子主服务器连接良好,我们能够运行构建。我们面临的问题是代理设置。是否有一种方法可以在远程代理中设置一个代理,该代理连接到外部服务器,以便成功地构建库。我们现在要做的是将代理手动配置到构建中的gradle任务。这不是做这件事的方法。因为在未来我们需要代理设置的地方可能会有100个版本。我们不能手动为所有这些构建配

  • 在Windows上,是否可以将Atom配置为使用系统默认代理,而不是在.apmrc文件中手动指定代理设置? 我最近开始使用atom-editor for Windows(Windows7 Pro),到目前为止我很喜欢它。我已经搜索了一段时间,试图让编辑能够连接到外部世界,但没有遇到任何成功。 我们的网络(我不是网络专家)配置为使用代理服务器(内部)访问Internet。在我的系统中,这是通过“自动

  • 是否可以使用PowerShell为管理员配置远程桌面,而无需在所有服务器上安装“远程桌面会话主机”角色?我们在关注RemoteDesktopServices模块。 这里的文档:http://technet.microsoft.com/en-us/library/cc743159.aspx说 "若要仅出于管理目的允许远程连接,您不必安装RD会话主机服务器。" 但是,所有使用PowerShell的说明

  • 我正在尝试使用OpenTelemetry代理从我用Scala编写的Akka应用程序中导出度量和跟踪,目的是使用OpenSearch中的数据。 我的应用程序的技术堆栈: Akka-2.6* 我已经将OpenTelemetry instrumentation运行时依赖项添加到构建中。sbt: 我正在属性文件中传递OpenTelem计配置: 我的代码中唯一其他相关的部分是属性文件: 我确实在OpenSe

  • 我正在使用以下代码: 在python webdriver中为FF设置代理。这适用于FF。如何在Chrome中设置这样的代理?我找到了这个exmaple,但不是很有帮助。当我运行脚本时,什么都没有发生(Chrome浏览器没有启动)。

  • 问题内容: 很多时候,Java应用程序需要连接到Internet。最常见的示例是在读取XML文件并需要下载其架构时发生的。 我在代理服务器后面。如何设置我的JVM使用代理? 问题答案: 从Java文档(不是 javadoc API)中: http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html 设置JVM标