diff --git a/app/scodoc/TrivialFormulator.py b/app/scodoc/TrivialFormulator.py
index d14d5e6a..69220cf1 100644
--- a/app/scodoc/TrivialFormulator.py
+++ b/app/scodoc/TrivialFormulator.py
@@ -757,6 +757,6 @@ def tf_error_message(msg):
     if isinstance(msg, str):
         msg = [msg]
     return (
-        '<ul class="tf-msg"><li class="tf-msg">%s</li></ul>'
-        % '</li><li class="tf-msg">'.join(msg)
+        '<ul class="tf-msg"><li class="tf-msg error-message">%s</li></ul>'
+        % '</li><li class="tf-msg tf-msg error-message">'.join(msg)
     )
diff --git a/app/scodoc/sco_dept.py b/app/scodoc/sco_dept.py
index e723139b..0bd3bfbb 100644
--- a/app/scodoc/sco_dept.py
+++ b/app/scodoc/sco_dept.py
@@ -111,7 +111,7 @@ def index_html(context, REQUEST=None, showcodes=0, showsemtable=0):
         # aucun semestre courant: affiche aide
         H.append(
             """<h2 class="listesems">Aucune session en cours !</h2>
-        <p>Pour ajouter une session, aller dans <a href="Notes">Programmes</a>,
+        <p>Pour ajouter une session, aller dans <a href="Notes" id="link-programmes">Programmes</a>,
         choisissez une formation, puis suivez le lien "<em>UE, modules, semestres</em>".
         </p><p>
         Là, en bas de page, suivez le lien
diff --git a/app/scodoc/sco_formations.py b/app/scodoc/sco_formations.py
index 62c17505..23880f68 100644
--- a/app/scodoc/sco_formations.py
+++ b/app/scodoc/sco_formations.py
@@ -259,6 +259,7 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
             f["parcours_name"] = ""
         f["_titre_target"] = "ue_list?formation_id=%(formation_id)s" % f
         f["_titre_link_class"] = "stdlink"
+        f["_titre_id"] = "titre-%s" % f["acronyme"].lower().replace(" ", "-")
         # Ajoute les semestres associés à chaque formation:
         f["sems"] = sco_formsemestre.do_formsemestre_list(
             context, args={"formation_id": f["formation_id"]}
@@ -266,13 +267,14 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
         f["sems_list_txt"] = ", ".join([s["session_id"] for s in f["sems"]])
         f["_sems_list_txt_html"] = ", ".join(
             [
-                '<a class="discretelink" href="formsemestre_status?formsemestre_id=%(formsemestre_id)s">%(session_id)s<a>'
-                % s
+                '<a class="discretelink" href="formsemestre_status?formsemestre_id=%(formsemestre_id)s">%('
+                "session_id)s<a> " % s
                 for s in f["sems"]
             ]
             + [
-                '<a class="stdlink" href="formsemestre_createwithmodules?formation_id=%(formation_id)s&semestre_id=1">ajouter</a>'
-                % f
+                '<a class="stdlink" id="add-semestre-%s" '
+                'href="formsemestre_createwithmodules?formation_id=%s&semestre_id=1">ajouter</a> '
+                % (f["acronyme"].lower().replace(" ", "-"), f["formation_id"])
             ]
         )
         if f["sems"]:
@@ -288,16 +290,17 @@ def formation_list_table(context, formation_id=None, args={}, REQUEST=None):
         else:
             but_locked = '<span class="but_placeholder"></span>'
         if editable and not locked:
-            but_suppr = (
-                '<a class="stdlink" href="formation_delete?formation_id=%s">%s</a>'
-                % (f["formation_id"], suppricon)
+            but_suppr = '<a class="stdlink" href="formation_delete?formation_id=%s" id="delete-formation-%s">%s</a>' % (
+                f["formation_id"],
+                f["acronyme"].lower().replace(" ", "-"),
+                suppricon,
             )
         else:
             but_suppr = '<span class="but_placeholder"></span>'
         if editable:
             but_edit = (
-                '<a class="stdlink" href="formation_edit?formation_id=%s">%s</a>'
-                % (f["formation_id"], editicon)
+                '<a class="stdlink" href="formation_edit?formation_id=%s" id="edit-formation-%s">%s</a>'
+                % (f["formation_id"], f["acronyme"].lower().replace(" ", "-"), editicon)
             )
         else:
             but_edit = '<span class="but_placeholder"></span>'
@@ -365,4 +368,4 @@ def formation_create_new_version(context, formation_id, redirect=True, REQUEST=N
             "ue_list?formation_id=" + new_id + "&msg=Nouvelle version !"
         )
     else:
-        return new_id, modules_old2new, ues_old2new
\ No newline at end of file
+        return new_id, modules_old2new, ues_old2new
diff --git a/app/views/notes.py b/app/views/notes.py
index d29e9e97..8f42c6ba 100644
--- a/app/views/notes.py
+++ b/app/views/notes.py
@@ -391,7 +391,7 @@ def index_html(context, REQUEST=None):
 
     if editable:
         H.append(
-            """<p><a class="stdlink" href="formation_create">Créer une formation</a></p>
+            """<p><a class="stdlink" href="formation_create" id="link-create-formation">Créer une formation</a></p>
     <p><a class="stdlink" href="formation_import_xml_form">Importer une formation (xml)</a></p>
         <p class="help">Une "formation" est un programme pédagogique structuré en UE, matières et modules. Chaque semestre se réfère à une formation. La modification d'une formation affecte tous les semestres qui s'y réfèrent.</p>
         """
@@ -1968,7 +1968,7 @@ def formsemestre_validation_etud_manu(
 def formsemestre_validate_previous_ue(
     context, formsemestre_id, etudid=None, REQUEST=None
 ):
-    "Form. saisie UE validée hors ScoDoc "
+    "Form. saisie UE validée hors ScoDoc"
     if not sco_permissions_check.can_validate_sem(formsemestre_id):
         return scu.confirm_dialog(
             message="<p>Opération non autorisée pour %s</h2>"