Skip to content

Instantly share code, notes, and snippets.

@Delphn
Forked from maugern/edt.py
Created June 6, 2019 19:16
Show Gist options
  • Select an option

  • Save Delphn/be702f3efef899addbd61d5f4a06e19d to your computer and use it in GitHub Desktop.

Select an option

Save Delphn/be702f3efef899addbd61d5f4a06e19d to your computer and use it in GitHub Desktop.

Revisions

  1. @maugern maugern revised this gist Jan 10, 2018. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion edt.py
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    #!/usr/bin/env python3.6
    #
    # Navigation with selenium on Firefox in the Valenciennes university website.
    # Copyright (C) 2017 Nicolas Mauger <[email protected]>
    # Copyright (C) 2018 Nicolas Mauger <[email protected]>
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as
  2. @maugern maugern revised this gist Jan 10, 2018. No changes.
  3. @maugern maugern created this gist Jan 10, 2018.
    111 changes: 111 additions & 0 deletions edt.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,111 @@
    #!/usr/bin/env python3.6
    #
    # Navigation with selenium on Firefox in the Valenciennes university website.
    # Copyright (C) 2017 Nicolas Mauger <[email protected]>
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as
    # published by the Free Software Foundation, either version 3 of the
    # License, or (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program. If not, see <https://www.gnu.org/licenses/>.

    # This program require selenium, gekodriver, datetime and argparse to run.

    # usage: Process some authentification in univ-valecenciennes.fr
    # [-h] [-d DATE] -u USERNAME -p PASSWORD
    #
    # optional arguments:
    # -h, --help show this help message and exit
    #
    # optional named arguments:
    # -d DATE, --date DATE Specific date of edt - format YYYY-MM-DD. Default:
    # today date
    #
    # required named arguments:
    # -u USERNAME, --username USERNAME
    # Your Sesame username
    # -p PASSWORD, --password PASSWORD
    # Your Sesame password

    # Reminder : your are not authorized to remove the above license, whatever the reason.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import Select
    from selenium.common.exceptions import NoSuchElementException

    import argparse
    import datetime

    # Setup the parser
    parser = argparse.ArgumentParser("Process some authentification in univ-valecenciennes.fr", add_help="True")

    # Define the options :

    # The following args are optional
    optinalNamed = parser.add_argument_group('optional named arguments')
    optinalNamed.add_argument("-d", "--date", help="Specific date of edt - format YYYY-MM-DD. Default: today date")

    # The following args are required:
    requiredNamed = parser.add_argument_group('required named arguments')
    requiredNamed.add_argument("-u", "--username", help="Your Sesame username", required=True)
    requiredNamed.add_argument("-p", "--password", help="Your Sesame password", required=True)

    args = parser.parse_args()

    # If the date is not set, set the current date
    if args.date:
    # Rise an exception if the dateformat is not respected
    try:
    year, month, day = map(int, args.date.split('-'))
    edt_date = datetime.date(year, month, day)
    except ValueError:
    msg = "Not a valid date: {}. Should be like : YYYY-mm-dd".format(args.date)
    raise argparse.ArgumentTypeError(msg)
    else:
    edt_date = datetime.date.today()

    #Define all xpaths for all DOM elements who will be use during the navigaton
    xpaths = { 'usernameTxtBox' : "//input[@name='username']",
    'passwordTxtBox' : "//input[@name='password']",
    'submitButton' : "//input[@name='submit']",
    'mesCoursButton' : "//a[@title='Mes cours']",
    'ExportButton' : "//a[@title='Export Pdf']"
    }

    mydriver = webdriver.Firefox()
    mydriver.get("https://cas.univ-valenciennes.fr/cas/login?service=https://portail.univ-valenciennes.fr/Login")
    mydriver.maximize_window()

    #Clear Username TextBox if already allowed "Remember Me"
    mydriver.find_element_by_xpath(xpaths['usernameTxtBox']).clear()

    #Write Username in Username TextBox
    mydriver.find_element_by_xpath(xpaths['usernameTxtBox']).send_keys(args.username)

    #Clear Password TextBox if already allowed "Remember Me"
    mydriver.find_element_by_xpath(xpaths['passwordTxtBox']).clear()

    #Write Password in password TextBox
    mydriver.find_element_by_xpath(xpaths['passwordTxtBox']).send_keys(args.password)

    #Click Login button
    mydriver.find_element_by_xpath(xpaths['submitButton']).click()

    #Go to "EDT" link
    mydriver.get('https://vtmob.univ-valenciennes.fr/esup-vtclient-up4/stylesheets/desktop/welcome.xhtml')

    #Go to correct date with the implemented JS fonction.
    mydriver.execute_script("document.getElementById('formCal:date').value='"+edt_date.strftime('%d/%m/%Y')+"';document.forms['formCal'].submit();")

    #Click Export button, who download the pdf.
    #The download action may be before page display, but the pdf
    #remains the correct one.
    mydriver.find_element_by_xpath(xpaths['ExportButton']).click()