# filename: LudusLogin
import os
from dotenv import load_dotenv
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.expected_conditions import title_is
from selenium.webdriver.support.wait import WebDriverWait
import time
def login():
# Firefox driver for running window
driver = Firefox()
# Going to website
driver.get("website")
WebDriverWait(driver, timeout=3).until(title_is("Meddelelser"))
# Login with credentials from .env
load_dotenv()
usr = os.getenv("usr")
passwd = os.getenv("passwd")
usr_field = driver.find_element(By.CSS_SELECTOR, "#brugerIdField")
passwd_field = driver.find_element(By.CSS_SELECTOR, "#kodeordField")
usr_field.send_keys(usr)
passwd_field.send_keys(passwd)
passwd_field.send_keys(Keys.RETURN)
# Closing messages
time.sleep(2)
close_btn_meddelelser = driver.find_element(By.CLASS_NAME, "v-window-closebox")
close_btn_meddelelser.click()
WebDriverWait(driver, timeout=3).until(title_is("Aktuelt"))
# window_handle = driver.window_handles
window_handle = driver.window_handles[0]
return window_handle
Next File I want to switch to the window from code above and continue executing code in the same window
# filename: Main.py
import LudusLogin
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import title_is
from selenium.webdriver.support.wait import WebDriverWait
handle = LudusLogin.login()
print(handle)
driver = Firefox(executable_path='geckodriver.exe')
driver.switch_to.window(handle)
skema_btn = driver.find_element(By.CSS_SELECTOR, "span.v-menubar-menuitem:nth-child(4)")
skema_btn.click()
WebDriverWait(driver, timeout=3).until(title_is("Skemaer"))
I want to be able to have all scripts for the website in Main.py or other files and just the login in one file. When I try as shown i get the error: selenium.common.exceptions.NoSuchWindowException: Message: Unable to locate window:
CodePudding user response:
Create new instance of Firefox driver in Main.py
first:
driver = Firefox()
Alter login
method and in LudusLogin.py
and make a change to accept input variable named driver
. Then delete line
driver = Firefox()
inside LudusLogin.py
and let login
body to use input variable driver
.
Now in Main.py
you have driver
variable to use after calling login
method. the driver
which you instantiate only once.
CodePudding user response:
Thanks for the answer, this is what I ended up with
import os
from dotenv import load_dotenv
# from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.expected_conditions import title_is
from selenium.webdriver.support.wait import WebDriverWait
import time
def login(driver):
# Going to website
driver.get("website")
WebDriverWait(driver, timeout=3).until(title_is("Meddelelser"))
# Login with credentials from .env
load_dotenv()
usr = os.getenv("usr")
passwd = os.getenv("passwd")
usr_field = driver.find_element(By.CSS_SELECTOR, "#brugerIdField")
passwd_field = driver.find_element(By.CSS_SELECTOR, "#kodeordField")
usr_field.send_keys(usr)
passwd_field.send_keys(passwd)
passwd_field.send_keys(Keys.RETURN)
# Closing messages
time.sleep(2)
close_btn_meddelelser = driver.find_element(By.CLASS_NAME, "v-window-closebox")
close_btn_meddelelser.click()
WebDriverWait(driver, timeout=3).until(title_is("Aktuelt"))
import LudusLogin
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import title_is
from selenium.webdriver.support.wait import WebDriverWait
driver = Firefox()
LudusLogin.login(driver)
skema_btn = driver.find_element(By.CSS_SELECTOR, "span.v-menubar-menuitem:nth-child(4)")
skema_btn.click()
WebDriverWait(driver, timeout=3).until(title_is("Skemaer"))