测试人社区

【求助贴】selenium使用Chrome无法显示(windows)

环境 windows7 64bit
python版本 3.7.3

执行运行以下代码时,浏览器无法弹出。
#!/usr/bin/python3

-- coding: utf-8 --

import time
#import pytest
from selenium import webdriver

class TestWait:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get(‘https://home.testing-studio.com’)
#self.driver.implicitly_wait(3)

def test_wait(self):
    time.sleep(3)
    print('dirct wait')

并报错以下日志信息:
Testing started at 14:22 …
C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe “D:\pycharm\PyCharm Community Edition 2019.1\plugins\python-ce\helpers\pycharm_jb_pytest_runner.py” --target test_wait.py::TestWait
Launching pytest with arguments test_wait.py::TestWait in E:\lagou\lg_class\selenium

============================= test session starts =============================
platform win32 – Python 3.7.3, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 – C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe
cachedir: .pytest_cache
metadata: {‘Python’: ‘3.7.3’, ‘Platform’: ‘Windows-7-6.1.7601-SP1’, ‘Packages’: {‘pytest’: ‘5.4.3’, ‘py’: ‘1.9.0’, ‘pluggy’: ‘0.13.1’}, ‘Plugins’: {‘allure-pytest’: ‘2.8.18’, ‘html’: ‘2.1.1’, ‘metadata’: ‘1.10.0’}, ‘JAVA_HOME’: ‘C:\Program Files\Java\jre1.8.0_231’}
rootdir: E:\lagou\lg_class\selenium
plugins: allure-pytest-2.8.18, html-2.1.1, metadata-1.10.0
collecting … collected 1 item

test_wait.py::TestWait::test_selenium ERROR [100%]
test setup failed
self = <selenium.webdriver.chrome.service.Service object at 0x0000000003D0AA58>

def start(self):
    """
    Starts the Service.

    :Exceptions:
     - WebDriverException : Raised either when it can't start the service
       or when it can't connect to the service
    """
    try:
        cmd = [self.path]
        cmd.extend(self.command_line_args())
        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        stdout=self.log_file,
                                        stderr=self.log_file,
                                      stdin=PIPE)

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\common\service.py:76:


self = <subprocess.Popen object at 0x0000000003D0A9E8>
args = [‘chromedriver’, ‘–port=8108’], bufsize = -1, executable = None
stdin = -1, stdout = -3, stderr = -3, preexec_fn = None, close_fds = False
shell = False, cwd = None
env = environ({‘ALLUSERSPROFILE’: ‘C:\ProgramData’, ‘APPDATA’: ‘C:\Users\Administrator\AppData\Roaming’, ‘CLASSPATH’: ‘…\csilogfile.log’, ‘TEAMCITY_VERSION’: ‘LOCAL’, ‘PYTEST_CURRENT_TEST’: ‘test_wait.py::TestWait::test_selenium (setup)’})
universal_newlines = None, startupinfo = None, creationflags = 0
restore_signals = True, start_new_session = False, pass_fds = ()

def __init__(self, args, bufsize=-1, executable=None,
             stdin=None, stdout=None, stderr=None,
             preexec_fn=None, close_fds=True,
             shell=False, cwd=None, env=None, universal_newlines=None,
             startupinfo=None, creationflags=0,
             restore_signals=True, start_new_session=False,
             pass_fds=(), *, encoding=None, errors=None, text=None):
    """Create new Popen instance."""
    _cleanup()
    # Held while anything is calling waitpid before returncode has been
    # updated to prevent clobbering returncode if wait() or poll() are
    # called from multiple threads at once.  After acquiring the lock,
    # code must re-check self.returncode to see if another thread just
    # finished a waitpid() call.
    self._waitpid_lock = threading.Lock()

    self._input = None
    self._communication_started = False
    if bufsize is None:
        bufsize = -1  # Restore default
    if not isinstance(bufsize, int):
        raise TypeError("bufsize must be an integer")

    if _mswindows:
        if preexec_fn is not None:
            raise ValueError("preexec_fn is not supported on Windows "
                             "platforms")
    else:
        # POSIX
        if pass_fds and not close_fds:
            warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
            close_fds = True
        if startupinfo is not None:
            raise ValueError("startupinfo is only supported on Windows "
                             "platforms")
        if creationflags != 0:
            raise ValueError("creationflags is only supported on Windows "
                             "platforms")

    self.args = args
    self.stdin = None
    self.stdout = None
    self.stderr = None
    self.pid = None
    self.returncode = None
    self.encoding = encoding
    self.errors = errors

    # Validate the combinations of text and universal_newlines
    if (text is not None and universal_newlines is not None
        and bool(universal_newlines) != bool(text)):
        raise SubprocessError('Cannot disambiguate when both text '
                              'and universal_newlines are supplied but '
                              'different. Pass one or the other.')

    # Input and output objects. The general principle is like
    # this:
    #
    # Parent                   Child
    # ------                   -----
    # p2cwrite   ---stdin--->  p2cread
    # c2pread    <--stdout---  c2pwrite
    # errread    <--stderr---  errwrite
    #
    # On POSIX, the child objects are file descriptors.  On
    # Windows, these are Windows file handles.  The parent objects
    # are file descriptors on both platforms.  The parent objects
    # are -1 when not using PIPEs. The child objects are -1
    # when not redirecting.

    (p2cread, p2cwrite,
     c2pread, c2pwrite,
     errread, errwrite) = self._get_handles(stdin, stdout, stderr)

    # We wrap OS handles *before* launching the child, otherwise a
    # quickly terminating child could make our fds unwrappable
    # (see #8458).

    if _mswindows:
        if p2cwrite != -1:
            p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
        if c2pread != -1:
            c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
        if errread != -1:
            errread = msvcrt.open_osfhandle(errread.Detach(), 0)

    self.text_mode = encoding or errors or text or universal_newlines

    # How long to resume waiting on a child after the first ^C.
    # There is no right value for this.  The purpose is to be polite
    # yet remain good for interactive users trying to exit a tool.
    self._sigint_wait_secs = 0.25  # 1/xkcd221.getRandomNumber()

    self._closed_child_pipe_fds = False

    try:
        if p2cwrite != -1:
            self.stdin = io.open(p2cwrite, 'wb', bufsize)
            if self.text_mode:
                self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
                        line_buffering=(bufsize == 1),
                        encoding=encoding, errors=errors)
        if c2pread != -1:
            self.stdout = io.open(c2pread, 'rb', bufsize)
            if self.text_mode:
                self.stdout = io.TextIOWrapper(self.stdout,
                        encoding=encoding, errors=errors)
        if errread != -1:
            self.stderr = io.open(errread, 'rb', bufsize)
            if self.text_mode:
                self.stderr = io.TextIOWrapper(self.stderr,
                        encoding=encoding, errors=errors)

        self._execute_child(args, executable, preexec_fn, close_fds,
                            pass_fds, cwd, env,
                            startupinfo, creationflags, shell,
                            p2cread, p2cwrite,
                            c2pread, c2pwrite,
                            errread, errwrite,
                          restore_signals, start_new_session)

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\subprocess.py:775:


self = <subprocess.Popen object at 0x0000000003D0A9E8>
args = ‘chromedriver --port=8108’, executable = None, preexec_fn = None
close_fds = False, pass_fds = (), cwd = None
env = environ({‘ALLUSERSPROFILE’: ‘C:\ProgramData’, ‘APPDATA’: ‘C:\Users\Administrator\AppData\Roaming’, ‘CLASSPATH’: ‘…\csilogfile.log’, ‘TEAMCITY_VERSION’: ‘LOCAL’, ‘PYTEST_CURRENT_TEST’: ‘test_wait.py::TestWait::test_selenium (setup)’})
startupinfo = <subprocess.STARTUPINFO object at 0x0000000003D0AA90>
creationflags = 0, shell = False, p2cread = Handle(300), p2cwrite = 11
c2pread = -1, c2pwrite = Handle(308), errread = -1, errwrite = Handle(296)
unused_restore_signals = True, unused_start_new_session = False

def _execute_child(self, args, executable, preexec_fn, close_fds,
                   pass_fds, cwd, env,
                   startupinfo, creationflags, shell,
                   p2cread, p2cwrite,
                   c2pread, c2pwrite,
                   errread, errwrite,
                   unused_restore_signals, unused_start_new_session):
    """Execute program (MS Windows version)"""

    assert not pass_fds, "pass_fds not supported on Windows."

    if not isinstance(args, str):
        args = list2cmdline(args)

    # Process startup details
    if startupinfo is None:
        startupinfo = STARTUPINFO()
    else:
        # bpo-34044: Copy STARTUPINFO since it is modified above,
        # so the caller can reuse it multiple times.
        startupinfo = startupinfo._copy()

    use_std_handles = -1 not in (p2cread, c2pwrite, errwrite)
    if use_std_handles:
        startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
        startupinfo.hStdInput = p2cread
        startupinfo.hStdOutput = c2pwrite
        startupinfo.hStdError = errwrite

    attribute_list = startupinfo.lpAttributeList
    have_handle_list = bool(attribute_list and
                            "handle_list" in attribute_list and
                            attribute_list["handle_list"])

    # If we were given an handle_list or need to create one
    if have_handle_list or (use_std_handles and close_fds):
        if attribute_list is None:
            attribute_list = startupinfo.lpAttributeList = {}
        handle_list = attribute_list["handle_list"] = \
            list(attribute_list.get("handle_list", []))

        if use_std_handles:
            handle_list += [int(p2cread), int(c2pwrite), int(errwrite)]

        handle_list[:] = self._filter_handle_list(handle_list)

        if handle_list:
            if not close_fds:
                warnings.warn("startupinfo.lpAttributeList['handle_list'] "
                              "overriding close_fds", RuntimeWarning)

            # When using the handle_list we always request to inherit
            # handles but the only handles that will be inherited are
            # the ones in the handle_list
            close_fds = False

    if shell:
        startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
        startupinfo.wShowWindow = _winapi.SW_HIDE
        comspec = os.environ.get("COMSPEC", "cmd.exe")
        args = '{} /c "{}"'.format (comspec, args)

    # Start the process
    try:
        hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
                                 # no special security
                                 None, None,
                                 int(not close_fds),
                                 creationflags,
                                 env,
                                 os.fspath(cwd) if cwd is not None else None,
                               startupinfo)

E FileNotFoundError: [WinError 2] 系统找不到指定的文件。

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\subprocess.py:1178: FileNotFoundError

During handling of the above exception, another exception occurred:

self = <test_wait.TestWait object at 0x0000000003D0AEF0>

def setup(self):
  self.driver = webdriver.Chrome()

test_wait.py:9:


C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\chrome\webdriver.py:73: in init
self.service.start()


self = <selenium.webdriver.chrome.service.Service object at 0x0000000003D0AA58>

def start(self):
    """
    Starts the Service.

    :Exceptions:
     - WebDriverException : Raised either when it can't start the service
       or when it can't connect to the service
    """
    try:
        cmd = [self.path]
        cmd.extend(self.command_line_args())
        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        stdout=self.log_file,
                                        stderr=self.log_file,
                                        stdin=PIPE)
    except TypeError:
        raise
    except OSError as err:
        if err.errno == errno.ENOENT:
            raise WebDriverException(
                "'%s' executable needs to be in PATH. %s" % (
                  os.path.basename(self.path), self.start_error_message)

E selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’ executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\common\service.py:83: WebDriverException

Assertion failed

Assertion failed

=================================== ERRORS ====================================
__________________ ERROR at setup of TestWait.test_selenium ___________________

self = <selenium.webdriver.chrome.service.Service object at 0x0000000003D0AA58>

def start(self):
    """
    Starts the Service.

    :Exceptions:
     - WebDriverException : Raised either when it can't start the service
       or when it can't connect to the service
    """
    try:
        cmd = [self.path]
        cmd.extend(self.command_line_args())
        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        stdout=self.log_file,
                                        stderr=self.log_file,
                                      stdin=PIPE)

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\common\service.py:76:


self = <subprocess.Popen object at 0x0000000003D0A9E8>
args = [‘chromedriver’, ‘–port=8108’], bufsize = -1, executable = None
stdin = -1, stdout = -3, stderr = -3, preexec_fn = None, close_fds = False
shell = False, cwd = None
env = environ({‘ALLUSERSPROFILE’: ‘C:\ProgramData’, ‘APPDATA’: ‘C:\Users\Administrator\AppData\Roaming’, ‘CLASSPATH’: ‘…\csilogfile.log’, ‘TEAMCITY_VERSION’: ‘LOCAL’, ‘PYTEST_CURRENT_TEST’: ‘test_wait.py::TestWait::test_selenium (setup)’})
universal_newlines = None, startupinfo = None, creationflags = 0
restore_signals = True, start_new_session = False, pass_fds = ()

def __init__(self, args, bufsize=-1, executable=None,
             stdin=None, stdout=None, stderr=None,
             preexec_fn=None, close_fds=True,
             shell=False, cwd=None, env=None, universal_newlines=None,
             startupinfo=None, creationflags=0,
             restore_signals=True, start_new_session=False,
             pass_fds=(), *, encoding=None, errors=None, text=None):
    """Create new Popen instance."""
    _cleanup()
    # Held while anything is calling waitpid before returncode has been
    # updated to prevent clobbering returncode if wait() or poll() are
    # called from multiple threads at once.  After acquiring the lock,
    # code must re-check self.returncode to see if another thread just
    # finished a waitpid() call.
    self._waitpid_lock = threading.Lock()

    self._input = None
    self._communication_started = False
    if bufsize is None:
        bufsize = -1  # Restore default
    if not isinstance(bufsize, int):
        raise TypeError("bufsize must be an integer")

    if _mswindows:
        if preexec_fn is not None:
            raise ValueError("preexec_fn is not supported on Windows "
                             "platforms")
    else:
        # POSIX
        if pass_fds and not close_fds:
            warnings.warn("pass_fds overriding close_fds.", RuntimeWarning)
            close_fds = True
        if startupinfo is not None:
            raise ValueError("startupinfo is only supported on Windows "
                             "platforms")
        if creationflags != 0:
            raise ValueError("creationflags is only supported on Windows "
                             "platforms")

    self.args = args
    self.stdin = None
    self.stdout = None
    self.stderr = None
    self.pid = None
    self.returncode = None
    self.encoding = encoding
    self.errors = errors

    # Validate the combinations of text and universal_newlines
    if (text is not None and universal_newlines is not None
        and bool(universal_newlines) != bool(text)):
        raise SubprocessError('Cannot disambiguate when both text '
                              'and universal_newlines are supplied but '
                              'different. Pass one or the other.')

    # Input and output objects. The general principle is like
    # this:
    #
    # Parent                   Child
    # ------                   -----
    # p2cwrite   ---stdin--->  p2cread
    # c2pread    <--stdout---  c2pwrite
    # errread    <--stderr---  errwrite
    #
    # On POSIX, the child objects are file descriptors.  On
    # Windows, these are Windows file handles.  The parent objects
    # are file descriptors on both platforms.  The parent objects
    # are -1 when not using PIPEs. The child objects are -1
    # when not redirecting.

    (p2cread, p2cwrite,
     c2pread, c2pwrite,
     errread, errwrite) = self._get_handles(stdin, stdout, stderr)

    # We wrap OS handles *before* launching the child, otherwise a
    # quickly terminating child could make our fds unwrappable
    # (see #8458).

    if _mswindows:
        if p2cwrite != -1:
            p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0)
        if c2pread != -1:
            c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0)
        if errread != -1:
            errread = msvcrt.open_osfhandle(errread.Detach(), 0)

    self.text_mode = encoding or errors or text or universal_newlines

    # How long to resume waiting on a child after the first ^C.
    # There is no right value for this.  The purpose is to be polite
    # yet remain good for interactive users trying to exit a tool.
    self._sigint_wait_secs = 0.25  # 1/xkcd221.getRandomNumber()

    self._closed_child_pipe_fds = False

    try:
        if p2cwrite != -1:
            self.stdin = io.open(p2cwrite, 'wb', bufsize)
            if self.text_mode:
                self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
                        line_buffering=(bufsize == 1),
                        encoding=encoding, errors=errors)
        if c2pread != -1:
            self.stdout = io.open(c2pread, 'rb', bufsize)
            if self.text_mode:
                self.stdout = io.TextIOWrapper(self.stdout,
                        encoding=encoding, errors=errors)
        if errread != -1:
            self.stderr = io.open(errread, 'rb', bufsize)
            if self.text_mode:
                self.stderr = io.TextIOWrapper(self.stderr,
                        encoding=encoding, errors=errors)

        self._execute_child(args, executable, preexec_fn, close_fds,
                            pass_fds, cwd, env,
                            startupinfo, creationflags, shell,
                            p2cread, p2cwrite,
                            c2pread, c2pwrite,
                            errread, errwrite,
                          restore_signals, start_new_session)

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\subprocess.py:775:


self = <subprocess.Popen object at 0x0000000003D0A9E8>
args = ‘chromedriver --port=8108’, executable = None, preexec_fn = None
close_fds = False, pass_fds = (), cwd = None
env = environ({‘ALLUSERSPROFILE’: ‘C:\ProgramData’, ‘APPDATA’: ‘C:\Users\Administrator\AppData\Roaming’, ‘CLASSPATH’: ‘…\csilogfile.log’, ‘TEAMCITY_VERSION’: ‘LOCAL’, ‘PYTEST_CURRENT_TEST’: ‘test_wait.py::TestWait::test_selenium (setup)’})
startupinfo = <subprocess.STARTUPINFO object at 0x0000000003D0AA90>
creationflags = 0, shell = False, p2cread = Handle(300), p2cwrite = 11
c2pread = -1, c2pwrite = Handle(308), errread = -1, errwrite = Handle(296)
unused_restore_signals = True, unused_start_new_session = False

def _execute_child(self, args, executable, preexec_fn, close_fds,
                   pass_fds, cwd, env,
                   startupinfo, creationflags, shell,
                   p2cread, p2cwrite,
                   c2pread, c2pwrite,
                   errread, errwrite,
                   unused_restore_signals, unused_start_new_session):
    """Execute program (MS Windows version)"""

    assert not pass_fds, "pass_fds not supported on Windows."

    if not isinstance(args, str):
        args = list2cmdline(args)

    # Process startup details
    if startupinfo is None:
        startupinfo = STARTUPINFO()
    else:
        # bpo-34044: Copy STARTUPINFO since it is modified above,
        # so the caller can reuse it multiple times.
        startupinfo = startupinfo._copy()

    use_std_handles = -1 not in (p2cread, c2pwrite, errwrite)
    if use_std_handles:
        startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES
        startupinfo.hStdInput = p2cread
        startupinfo.hStdOutput = c2pwrite
        startupinfo.hStdError = errwrite

    attribute_list = startupinfo.lpAttributeList
    have_handle_list = bool(attribute_list and
                            "handle_list" in attribute_list and
                            attribute_list["handle_list"])

    # If we were given an handle_list or need to create one
    if have_handle_list or (use_std_handles and close_fds):
        if attribute_list is None:
            attribute_list = startupinfo.lpAttributeList = {}
        handle_list = attribute_list["handle_list"] = \
            list(attribute_list.get("handle_list", []))

        if use_std_handles:
            handle_list += [int(p2cread), int(c2pwrite), int(errwrite)]

        handle_list[:] = self._filter_handle_list(handle_list)

        if handle_list:
            if not close_fds:
                warnings.warn("startupinfo.lpAttributeList['handle_list'] "
                              "overriding close_fds", RuntimeWarning)

            # When using the handle_list we always request to inherit
            # handles but the only handles that will be inherited are
            # the ones in the handle_list
            close_fds = False

    if shell:
        startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW
        startupinfo.wShowWindow = _winapi.SW_HIDE
        comspec = os.environ.get("COMSPEC", "cmd.exe")
        args = '{} /c "{}"'.format (comspec, args)

    # Start the process
    try:
        hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
                                 # no special security
                                 None, None,
                                 int(not close_fds),
                                 creationflags,
                                 env,
                                 os.fspath(cwd) if cwd is not None else None,
                               startupinfo)

E FileNotFoundError: [WinError 2] 系统找不到指定的文件。

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\subprocess.py:1178: FileNotFoundError

During handling of the above exception, another exception occurred:

self = <test_wait.TestWait object at 0x0000000003D0AEF0>

def setup(self):
  self.driver = webdriver.Chrome()

test_wait.py:9:


C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\chrome\webdriver.py:73: in init
self.service.start()


self = <selenium.webdriver.chrome.service.Service object at 0x0000000003D0AA58>

def start(self):
    """
    Starts the Service.

    :Exceptions:
     - WebDriverException : Raised either when it can't start the service
       or when it can't connect to the service
    """
    try:
        cmd = [self.path]
        cmd.extend(self.command_line_args())
        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        stdout=self.log_file,
                                        stderr=self.log_file,
                                        stdin=PIPE)
    except TypeError:
        raise
    except OSError as err:
        if err.errno == errno.ENOENT:
            raise WebDriverException(
                "'%s' executable needs to be in PATH. %s" % (
                  os.path.basename(self.path), self.start_error_message)

E selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’ executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\common\service.py:83: WebDriverException
=========================== short test summary info ===========================
ERROR test_wait.py::TestWait::test_selenium - selenium.common.exceptions.WebD…
============================== 1 error in 1.25s ===============================

Process finished with exit code 1

Assertion failed

Assertion failed

Assertion failed

Assertion failed

环境变量配置为

不知道是哪里有问题,查询了几次,求助

这句话已经说的很清楚了,你没配置好chromedriver,需要提前配置

1 Like

谢谢思涵老师,我重新配置下就可以了,我看上面报错一直还在找那个文件丢失。前面有个报错是文件找不到。
E FileNotFoundError: [WinError 2] 系统找不到指定的文件。

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\subprocess.py:1178: FileNotFoundError