I am trying to build a script that will send me an email about upcoming races and marathons for the following month on the first of the current month (for testing I have it set to the current day). My script works on my Pycharm IDE, but doesn't work with Pythonanywhere - python anywhere is not able to find the elements that I want to interact with, ('First Error' printed every time) and sometimes it crashes-It's not loading the page properly. Does anyone know what I'm doing wrong?
Here is the code:
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditionsfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.support.wait import WebDriverWaitfrom smtplib import SMTPfrom datetime import datetimeimport requestsimport osimport timefrom bs4 import BeautifulSoupEMAIL = 'bocaj.a31@gmail.com'PASSWORD = os.environ.get('PASSWORD')print(PASSWORD)response = requests.get('https://www.runguides.com/')response.raise_for_status()# print(response.text)soup = BeautifulSoup(response.text, 'html.parser')link_extension = soup.select_one(selector='#footer > div.wrapper.footer-bottom > div > div.col-12.hide-on-tablet > div > ul > li:nth-child(66) > a').get('href')print(link_extension)chrome_options = webdriver.ChromeOptions()#I tried to add these to pythonanywhere to fix a different problem#---------------------------------------# chrome_options.add_argument("--no-sandbox")# chrome_options.add_argument("--headless")# chrome_options.add_argument("--disable-gpu")# chrome_options.add_argument('--disable-dev-shm-usage')#------------------------------------------chrome_options.add_experimental_option('detach',True)main_driver = webdriver.Chrome(options=chrome_options)if (datetime.now().day == 31): main_driver.get(f'https://www.runguides.com{link_extension}') main_driver.maximize_window() try: WebDriverWait(main_driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH,'/html/body/div[2]/div[3]/div/div[6]/div[4]/md-menu[1]/button'))) except TimeoutException: print("First ERR") else: print('Success') main_driver.find_element(By.XPATH, value='//*[@id="main-listing-container"]/div[4]/md-menu[1]/button').click() try: WebDriverWait(main_driver, 120).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR,'md-menu-content md-menu-item .md-button .ng-binding'))) except TimeoutException: print("ERROR") else: months_elements = main_driver.find_elements(By.CSS_SELECTOR, value='md-menu-content md-menu-item .md-button .ng-binding') print(months_elements) names = [item.text for item in months_elements] print(names) try: month_names = months_elements[names.index('January'):] except ValueError: time.sleep(5) names = [item.text for item in months_elements] month_names = months_elements[names.index('January'):] print(month_names) month_names[datetime.now().month].click() try: WebDriverWait(main_driver, 120).until(expected_conditions.presence_of_element_located( (By.CSS_SELECTOR, 'tbody tr'))) except TimeoutException: print('Error') else: print('Success') try: all_race_dates = [race_date.text for race_date in main_driver.find_elements(By.CSS_SELECTOR, value='tbody .listing-container .listing-date .clickable') if 'Ontario' not in race_date.text] print(all_race_dates) all_race_names = [race_names.text for race_names in main_driver.find_elements(By.CSS_SELECTOR, value='tbody .listing-container .listing-title .clickable')] print(all_race_names) email_string = '' for i in range(len(all_race_names)): email_string +=f'{all_race_names[i]} on {all_race_dates[i]} \n' if email_string != '': with SMTP('smtp.gmail.com') as connection: connection.starttls() connection.login(user=EMAIL, password=PASSWORD) connection.sendmail(from_addr=EMAIL, to_addrs=EMAIL, msg=f'Subject: Races next Month!!\n\n{email_string}') except: print('Password Error') main_driver.quit()#Obviously if it works, there should be a "Password Error" because that is an environment variable#I've tried looking at documentation, adding the arguments I did to get the driver to not crash, and I tried adding print statemnts in various places to debug`