我无法获取Selenium代码以在现有浏览器中打开选项卡

rn0zuynd  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(235)

我试图让Selenium在Chrome中作为现有的浏览器工作,我的代码非常简单,我只是不知道为什么它不能工作。(PS我用的是Mac)
https://www.youtube.com/watch?v=Zrx8FSEo9lk&t=161s&ab_channel=Mukeshotwani
这是我想关注的YouTube视频的链接

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

opt = Options()
opt.add_experimental_option("debuggerAddress","localhost:8989")

driver = webdriver.Chrome(executable_path='/Users/adeelsyed/Downloads/chromedriver_mac64',chrome_options=opt)

url = 'https://monkeytype.com/'
driver.get(url)

print("test")

所以在我运行这段代码之前,我在终端/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=8989中输入
终端会打开一个chrome标签,但是当我点击运行时什么也没发生,它不会打印出“test”
相反它给出了一个很大的误差

DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(executable_path='/Users/adeelsyed/Downloads/chromedriver_mac64',chrome_options=opt)
/Users/adeelsyed/Desktop/Summer Grind Projects/UpdatedMonkType.py:9: DeprecationWarning: use options instead of chrome_options
  driver = webdriver.Chrome(executable_path='/Users/adeelsyed/Downloads/chromedriver_mac64',chrome_options=opt)
Traceback (most recent call last):
  File "/Users/adeelsyed/Desktop/Summer Grind Projects/UpdatedMonkType.py", line 9, in <module>
    driver = webdriver.Chrome(executable_path='/Users/adeelsyed/Downloads/chromedriver_mac64',chrome_options=opt)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/chrome/webdriver.py", line 84, in __init__
    super().__init__(
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/chromium/webdriver.py", line 104, in __init__
    super().__init__(
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 286, in __init__
    self.start_session(capabilities, browser_profile)
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 378, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot connect to chrome at localhost:8989
from chrome not reachable
Stacktrace:
0   chromedriver                        0x0000000104da78ac chromedriver + 4257964
1   chromedriver                        0x0000000104d9ff40 chromedriver + 4226880
2   chromedriver                        0x00000001049dc854 chromedriver + 280660
3   chromedriver                        0x00000001049cb004 chromedriver + 208900
4   chromedriver                        0x0000000104a08550 chromedriver + 460112
5   chromedriver                        0x0000000104a017bc chromedriver + 432060
6   chromedriver                        0x0000000104a3f3dc chromedriver + 685020
7   chromedriver                        0x0000000104a3ec08 chromedriver + 683016
8   chromedriver                        0x0000000104a0b98c chromedriver + 473484
9   chromedriver                        0x0000000104a0c98c chromedriver + 477580
10  chromedriver                        0x0000000104d66900 chromedriver + 3991808
11  chromedriver                        0x0000000104d6a354 chromedriver + 4006740
12  chromedriver                        0x0000000104d6a940 chromedriver + 4008256
13  chromedriver                        0x0000000104d7033c chromedriver + 4031292
14  chromedriver                        0x0000000104d6af34 chromedriver + 4009780
15  chromedriver                        0x0000000104d43490 chromedriver + 3847312
16  chromedriver                        0x0000000104d889f4 chromedriver + 4131316
17  chromedriver                        0x0000000104d88b4c chromedriver + 4131660
18  chromedriver                        0x0000000104d99230 chromedriver + 4198960
19  libsystem_pthread.dylib             0x000000018196606c _pthread_start + 148
20  libsystem_pthread.dylib             0x0000000181960e2c thread_start + 8

我的代码有什么问题?
无论如何,我尝试使用不同的可执行文件_path ='/Users/adeelsyed/Downloads/chromedriver_mac64\2/chromedriver',因为这是终端吐出来的,但也不起作用,我真的不知道这里出了什么问题。

o2rvlv0m

o2rvlv0m1#

一个月前,当我需要在一个浏览器中测试多个应用程序时,我也遇到了同样的问题。每次考试前我都要登录,这很让人恼火。
我花了两天半的时间解决了这个问题。让我与你分享解决方案。
在运行脚本之前,您不需要手动运行任何命令。只需按照以下步骤操作:

第一步,请确保您安装了最新版本的seleniumwebdriver-manager,命令如下:

pip install selenium webdriver-manager

第二步.确保您安装的是最新版本的Chrome。
解决方案:

下面是在Windows机器上测试并正常工作的代码:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

driverPath = ChromeDriverManager().install()
subprocess.Popen(["start","chrome","--remote-debugging-port=9089","--user-data-dir=" + os.getcwd() + "/chromeProfile",],shell=True)
options = Options()
options.add_argument("--start-maximized")
options.add_experimental_option("debuggerAddress", "localhost:9089")
service = Service(executable_path=driverPath)
driver = webdriver.Chrome(service=service,options=options)

现在您可以使用上面的驱动程序示例打开任何URL。

url = 'https://monkeytype.com/'
driver.get(url)

print("test")

当你运行这个脚本时,它会在你当前的工作目录中创建一个名为“chromeProfile”的文件夹。所有浏览器数据和历史记录都将保存到该文件夹中。您将不需要再次登录并再次登录同一个Web应用程序。
就是这样。
让我知道如果你仍然面临任何问题。

3duebb1j

3duebb1j2#

Mac版

正如我们所知,subprocess模块使用我们的操作系统终端来执行命令。
因此,如果您在Mac上,则由于终端命令的差异,上述代码将无法在您的机器上工作。
您只需要根据您的操作系统更改subprocess命令。这行代码的主要目的是使用任何开放的自由端口(9089)在远程调试模式下打开Chrome,以便Selenium可以检测驱动程序并将其与打开的Chrome示例绑定。
要转换在Mac上启用远程调试的Chrome启动代码,您可以使用subprocess.run函数。下面是修改后的代码:

import subprocess
import os

chrome_command = [
    "open",
    "-a",
    "Google Chrome",
    "--args",
    "--remote-debugging-port=9089",
    "--user-data-dir=" + os.getcwd() + "/chromeProfile",
]

subprocess.run(chrome_command)

让我解释一下上面的代码:

  • 使用subprocess.run代替subprocess.Popen。这简化了代码,并提供了一种更直接的方法来执行命令。
  • 在macOS上打开Chrome的命令是“open”。它与-a标志结合使用,以指定要打开的应用程序,在本例中为“Google Chrome”。
  • --args标志用于指示应将以下参数传递给应用程序。
  • --remote-debugging-port=9089“和“--user-data-dir=“+ os.getcwd() +“/chromeProfile“参数保持不变,在端口9089上启用远程调试,并使用存储在当前工作目录中的“chromeProfile”文件夹中的单独用户配置文件。

通过使用这些修改,代码应该可以在Mac上成功启动Chrome并启用远程调试。

注意所有剩余的代码行将与上面的答案相同。

相关问题