Python Forum

Full Version: Selenium Window Not Closing
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I have moved a script from Python 3.8.13 (Windows 7) to Python 3.10.4 (Windows 10) and there seems to be several differences I don't understand. I am using Selenium to web scrape via Firefox and all is working fine except one difference. Under 3.8, the command prompt (apparently needed for Selenium) window closed automatically when the script ended. Under 3.10, instead of closing automatically, a command prompt comes up and I have to 'exit' manually. How do I get the Selenium command prompt to close automatically like it did under 3.8? At this point there is no Python script running.
normally, you'd use driver.close()
use same name as instantiated for the open, example
for example if you used browser = webdriver.Firefox(options=options)
to open the browser, then use browser.close()
replace 'browser' with whatever you named the instance of webdriver.
Thanks. I was using browser.quit() under 3.8. I tried browser.close() under 3.10 and get the same result. Not sure I described it right but it is the command window that is not closing but rather returning a prompt. I should add, if it matters, that the command windows is minimized at the time.
If you post your code, we can analyze it for you, pretty much impossible otherwise.
I use Linux for all of my work, but basic operations should be portable.
You might want to take a look at Snippsat's tutorials which are located below:
web scraping part 1
web scraping part 2
Thanks. As you analyze this (code is sanitized) keep in mind that the issue appears to be some difference between 3.8 (which works) and 3.10 or perhaps Windows 7 (using 3.8) and 10 (using 3.10).

import win32gui as win32
import win32api
import win32con
import re
import win32process
from win32gui import GetWindowText,GetForegroundWindow
import pyperclip as CB
from datetime import datetime
import tkinter as tk
from tkinter import ttk
import time
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
 
def getPhoneTray():
    windows = []
    win32.EnumWindows(lambda hwnd, resultList: resultList.append(hwnd),
    windows)
    for window in windows:
        a=win32.GetWindowText(window)
        if (a.__contains__('PhoneTray')):
            win32.ShowWindow(window,9)
            win32.SetForegroundWindow(window)
            break
    wnd=win32.GetForegroundWindow()
    CB.copy('')
    clip=CB.waitForNewPaste()
    data=clip.split()
    number=data[len(data)-4]
    date=data[len(data)-3]
    time=data[len(data)-2]
    ampm=data[len(data)-1]
    name=data[1]
    if (data[2]!=data[len(data)-4]):
        name+=' '+data[2]
    return(name,number,date,time,ampm)
 
def center(win):
    """
    centers a tkinter window
    :param win: the main window or Toplevel window to center
    """
    win.update_idletasks()
    width = win.winfo_width()
    frm_width = win.winfo_rootx() - win.winfo_x()
    win_width = width + 2 * frm_width
    height = win.winfo_height()
    titlebar_height = win.winfo_rooty() - win.winfo_y()
    win_height = height + titlebar_height + frm_width
    x = win.winfo_screenwidth() // 2 - win_width // 2
    y = win.winfo_screenheight() // 2 - win_height // 2
    win.geometry('{}x{}+{}+{}'.format(width, height, x, y))
    win.deiconify()
 
def getSelect(page):
    select=page.html.find(id='ddlSubjectMatter')
    result=BeautifulSoup(str(select),'html.parser')
    selection={}
    for option in result.find_all('option'):
        if (len(option.attrs['value'])>0):
            selection[option.attrs['value']]=option.get_text()
    return(selection)
 
def cancel(top,browser):
    top.quit()
    browser.quit()
    exit(0)
 
def validatePhone(top):
    num=phone.get()
    pattern=re.compile('\d{3}-\d{3}-\d{4}')
    if (pattern.search(num)):
        top.withdraw()
        top.quit()
    else:
        phone.configure(background='Red')
    return(pattern.search(num))
 
def msgPanel(msg):
    panel=tk.Toplevel()
    panel.title('Do Not Call Interface')
    panel.geometry('200x100')
    tk.Label(panel,text='').grid(row=0,column=0)
    tk.Label(panel,text=msg).grid(row=1,column=1,columnspan=3)
    panel.update()
    return(panel)
 
top=tk.Tk()
top.withdraw()
intro=msgPanel('Copy line from Phonetray panel')
if (tk.Toplevel.winfo_exists(intro)==1):
    nme,num,dte,tim,pmam=getPhoneTray()
    if (nme.find('Spam')>=0 or nme.find('Telemarketer')>=0):
        nme='Unavaliable'
    intro.destroy()
else:
    nme='Unknown'
    num=''
contact=msgPanel('Contacting Do Not Call Web Site')
url='https://www.donotcall.gov/report.html'
options=Options()
options.add_argument("--headless")
#options.binary=FirefoxBinary(r'C:\Program Files\Mozilla Firefox\firefox.exe')
ser=Service(r'C:\Program Files\Python310\Scripts\geckodriver.exe')
browser=webdriver.Firefox(service=ser,options=options)
browser.get(url)
button_continue=browser.find_elements_by_css_selector('#MainContinueButton')
button_continue[0].click()
try:
    wait=WebDriverWait(browser,10)
    wait.until(EC.visibility_of_all_elements_located((By.ID,'ddlSubjectMatter')))
except (TimeoutException):
    contact.destroy()
    err=msgPanel('Do not call server too slow - try later')
    browser.quit()
    time.sleep(15)
    err.destroy()
    exit(-1)  
contact.destroy()
gui=msgPanel('Setting up user input')
topWidth=600
topHeight=200
top.title("Do Not Call Interface")
top.geometry(str(topWidth)+'x'+str(topHeight))
top.resizable(False,False)
rw=0
myPhone=tk.StringVar()
tk.Radiobutton(top,text='xxx-xxx-7932',variable=myPhone,value='xxx-xxx-7932').grid(row=rw,column=0,pady=5,columnspan=2)
tk.Radiobutton(top,text='yyy-yyy-6305',variable=myPhone,value='yyy-yyy-6305').grid(row=rw,column=2,pady=5,columnspan=2)
tk.Radiobutton(top,text='zzz-zzz-7477',variable=myPhone,value='zzz-zzz-7477').grid(row=rw,column=4,pady=5,columnspan=2)
myPhone.set(xxx-xxx-7932')
rw+=1
tk.Label(top,text='Phone',justify=tk.LEFT).grid(row=rw,column=0,pady=5,sticky=tk.W)
phone=tk.Entry(top,width=12,justify=tk.LEFT)
phone.grid(row=rw,column=1,pady=5,sticky=tk.W)
phone.insert(0,num)
phone.focus_set()
rw+=1
tk.Label(top,text='Caller Name',justify=tk.LEFT).grid(row=rw,column=0,pady=5,sticky=tk.W)
name=tk.StringVar()
nameEntry=tk.Entry(top,textvariable=name,width=48,justify=tk.LEFT)
nameEntry.grid(row=rw,column=1,pady=5,columnspan=4)
name.set(nme)
rw+=1
tk.Label(top,text='Date',justify=tk.LEFT).grid(row=rw,column=0,pady=5,sticky=tk.W)
dateTime=datetime.now()
today=tk.Entry(top,width=10,justify=tk.LEFT)
today.grid(row=rw,column=1,pady=5,sticky=tk.W)
today.insert(0,dte)
tk.Label(top,text='Time',justify=tk.LEFT).grid(row=rw,column=2,pady=5,sticky=tk.W)
now=tk.Entry(top,width=6,justify=tk.LEFT)
now.grid(row=rw,column=3,pady=5,sticky=tk.W)
ampm=tk.IntVar()
now.insert(0,tim)
if (pmam=='AM'):
    ampm.set(1)
else:
    ampm.set(2)
tk.Radiobutton(top,text='AM',variable=ampm,value=1).grid(row=rw,column=4,pady=5,sticky=tk.W)
tk.Radiobutton(top,text='PM',variable=ampm,value=2).grid(row=rw,column=5,pady=5,sticky=tk.W)
rw+=1
subjectList=Select(browser.find_element_by_css_selector('#ddlSubjectMatter'))
selections={}
for opt in subjectList.options:
    if (opt.text!=''):
        selections[opt.get_attribute('value')]=opt.text
subject=tk.StringVar()
subjectMatter=ttk.Combobox(top,textvariable=subject,width=53,justify=tk.LEFT)
subjectMatter['state']='readonly'
subjectMatter['values']=list(selections.values())
tk.Label(top,text='Subject',justify=tk.LEFT).grid(row=rw,column=0,pady=5,sticky=tk.W)
subjectMatter.grid(row=rw,column=1,columnspan=5)
subject.set('Unknown')
rw+=1
submitButton=tk.Button(top,text='Submit',command=lambda: validatePhone(top))
submitButton.grid(row=rw,column=2,pady=5,sticky=tk.W)
cancelButton=tk.Button(top,text='Cancel',command=lambda: cancel(top,browser)).grid(row=rw,column=4,pady=5,sticky=tk.W)
center(top)
gui.destroy()
top.mainloop()
sbmt=msgPanel('Submitting Report')
day=today.get()
phoneEntry=browser.find_element_by_css_selector('#PhoneTextBox')
phoneEntry.send_keys(myPhone.get())
dateEntry=browser.find_element_by_css_selector('#DateOfCallTextBox')
dateEntry.send_keys(day)
hour=Select(browser.find_element_by_css_selector('#TimeOfCallDropDownList'))
hh24=tim[0:2]
if (hh24[1:]==':'):
    hh24=tim[0:1]
if (pmam=='PM'):
    hh42=str(int(hh24)+12)
if (len(str(hh24))<2):
    hour.select_by_value('0'+str(hh24))
else:
    hour.select_by_value(str(hh24))
minute=Select(browser.find_element_by_css_selector('#ddlMinutes'))
mm=tim[3:]
if (len(mm)<2):
    mm='0'+mm
minute.select_by_value(mm)
subjectList.select_by_visible_text(subject.get())
preRecorded=browser.find_element_by_css_selector('#PrerecordMessageYESRadioButton')
preRecorded.click()
notText=browser.find_element_by_css_selector('#PhoneCallRadioButton')
preRecorded.click()
notText=browser.find_element_by_css_selector('#PhoneCallRadioButton')
notText.click()
nextStep=browser.find_element_by_css_selector('#StepOneContinueButton')
nextStep.click()
callerPhone=browser.find_element_by_css_selector('#CallerPhoneNumberTextBox')
callerPhone.send_keys(phone.get())
callerName=browser.find_element_by_css_selector('#CallerNameTextBox')
callerName.send_keys(name.get())
business=browser.find_element_by_css_selector('#HaveBusinessNoRadioButton')
business.click()
stopCalling=browser.find_element_by_css_selector('#StopCallingYesRadioButton')
stopCalling.click()
firstName=browser.find_element_by_css_selector('#FirstNameTextBox')
firstName.send_keys('Dennis')
LastName=browser.find_element_by_css_selector('#LastNameTextBox')
LastName.send_keys('nnnnnnnnn')
street=browser.find_element_by_css_selector('#StreetAddressTextBox')
street.send_keys('nnn sssss sssss Rd.')
city=browser.find_element_by_css_selector('#CityTextBox')
city.send_keys('ccccccccc')
state=Select(browser.find_element_by_css_selector('#StateDropDownList'))
state.select_by_visible_text('GA')
zipcode=browser.find_element_by_css_selector('#ZipCodeTextBox')
zipcode.send_keys('nnnnnn')
step2Submit=browser.find_element_by_css_selector('#StepTwoSubmitButton')
step2Submit.click()
try:
    wait=WebDriverWait(browser,5)
    wait.until(EC.presence_of_element_located((By.ID,'StepTwoAcceptedPanel')))
    msg='Report accepted'
except (TimeoutException):
    msg='Submission failed'
sbmt.destroy()
success=msgPanel(msg)
browser.quit()
time.sleep(3)
success.destroy()
top.destroy()