Repository: hhursev/recipe-scrapers
Pull request #514 (2022-03-29 10:12:49)

Added support for latelierderoxane.com
Added support for a french site [latelierderoxane.com](https://www.latelierderoxane.com/blog/recettes/)

Please tell me if there is anything wrong. :)

hhursev: No complaints from me! 🍻 :) The linters github action is complaining because of the black check though.

Can you please run: `black .` from within the project's root and commit the changes. I'll merge + bump version afterwards.
coveralls: 
[![Coverage Status](https://coveralls.io/builds/47802375/badge)](https://coveralls.io/builds/47802375)

Coverage increased (+0.03%) to 96.61% when pulling **5073e91fb20f67f4596b51a59c662cb105bab737 on ARE2KUSU:main** into **88f564785de8d29b9b64b738173c418e68422c0e on hhursev:main**.

ARE2KUSU: > No complaints from me! 🍻 :) The linters github action is complaining because of the black check though.
> 
> Can you please run: `black .` from within the project's root and commit the changes. I'll merge + bump version afterwards.

Done ;)


Patch:
diff --git a/README.rst b/README.rst
index 2e6fc2da..88629ef1 100644
--- a/README.rst
+++ b/README.rst
@@ -174,6 +174,7 @@ Scrapers available for:
 - `https://www.kptncook.com/ <https://www.kptncook.com>`_
 - `https://kuchnia-domowa.pl/ <https://www.kuchnia-domowa.pl/>`_
 - `https://www.kwestiasmaku.com/ <https://www.kwestiasmaku.com/>`_
+- `https://www.latelierderoxane.com <https://www.latelierderoxane.com/blog/recettes/>`_
 - `https://lecremedelacrumb.com/ <https://lecremedelacrumb.com/>`_
 - `https://lekkerensimpel.com <https://lekkerensimpel.com>`_
 - `https://littlespicejar.com/ <https://littlespicejar.com>`_
diff --git a/recipe_scrapers/__init__.py b/recipe_scrapers/__init__.py
index 3fd71442..9a791d5b 100644
--- a/recipe_scrapers/__init__.py
+++ b/recipe_scrapers/__init__.py
@@ -92,6 +92,7 @@ from .koket import Koket
 from .kptncook import KptnCook
 from .kuchniadomowa import KuchniaDomowa
 from .kwestiasmaku import KwestiaSmaku
+from .latelierderoxane import LAtelierDeRoxane
 from .lecremedelacrumb import LeCremeDeLaCrumb
 from .lekkerensimpel import LekkerEnSimpel
 from .littlespicejar import LittleSpiceJar
@@ -284,6 +285,7 @@ SCRAPERS = {
     KptnCook.host(subdomain="sharing"): KptnCook,
     KuchniaDomowa.host(): KuchniaDomowa,
     KwestiaSmaku.host(): KwestiaSmaku,
+    LAtelierDeRoxane.host(): LAtelierDeRoxane,
     LeCremeDeLaCrumb.host(): LeCremeDeLaCrumb,
     LekkerEnSimpel.host(): LekkerEnSimpel,
     LittleSpiceJar.host(): LittleSpiceJar,
diff --git a/recipe_scrapers/latelierderoxane.py b/recipe_scrapers/latelierderoxane.py
new file mode 100644
index 00000000..a43c61c5
--- /dev/null
+++ b/recipe_scrapers/latelierderoxane.py
@@ -0,0 +1,59 @@
+from ._abstract import AbstractScraper
+from ._utils import get_minutes, get_yields, normalize_string
+
+
+class LAtelierDeRoxane(AbstractScraper):
+    @classmethod
+    def host(cls):
+        return "latelierderoxane.com"
+
+    def image(self):
+        image = self.soup.find(
+            "img", {"class": "attachment-single size-single wp-post-image"}
+        )
+        return image["src"] if image else None
+
+    def title(self):
+        div = self.soup.find("div", {"class": "bloc_titreh1 bloc_blog"})
+        return div.find("h1").get_text()
+
+    def description(self):
+        div = self.soup.find("div", {"class": "bloc_chapeau bloc_blog"})
+        return div.find("p").get_text()
+
+    def total_time(self):
+        return get_minutes(self.get_bloc_temps_value_by_index(0))
+
+    def prep_time(self):
+        return get_minutes(self.get_bloc_temps_value_by_index(1))
+
+    def cook_time(self):
+        return get_minutes(self.get_bloc_temps_value_by_index(2))
+
+    def yields(self):
+        return get_yields(self.get_bloc_temps_value_by_index(4))
+
+    def ingredients(self):
+        raw_ingredients = self.soup.find_all("div", {"class": "ingredient"})
+        formatted_ingredients = []
+        for ingredient in raw_ingredients:
+            formatted_ingredients.append(ingredient.get_text())
+        return formatted_ingredients
+
+    def instructions(self):
+        instruction_bloc = self.soup.find(
+            "div", {"class": "bloc_texte_simple bloc_blog"}
+        )
+        instructions = instruction_bloc.find_all("li")
+        return "\n".join(
+            [normalize_string(instruction.get_text()) for instruction in instructions]
+        )
+
+    def site_name(self):
+        return "L'Atelier de Roxane"
+
+    def get_bloc_temps_value_by_index(self, i):
+        div_bloc = self.soup.find("div", {"class": "bloc_temps bloc_blog"})
+        div_infos = div_bloc.find("div", {"class": "infos"})
+        span_value = div_infos.find_all("span", {"class": "valeur"})
+        return span_value[i].get_text()


Test patch:
diff --git a/tests/test_data/latelierderoxane.testhtml b/tests/test_data/latelierderoxane.testhtml
new file mode 100644
index 00000000..7f0ad9a1
--- /dev/null
+++ b/tests/test_data/latelierderoxane.testhtml
@@ -0,0 +1,54 @@
+<html data-lt-installed="true" class=" ypfkojdsoc idc0_338 lhbtyhkp" lang="fr-FR"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1"><title>Recette cake marbré | L'atelier de Roxane</title><link rel="stylesheet" href="https://www.latelierderoxane.com/blog/wp-content/cache/min/1/160a966f8a53c49ba06b24068447dea3.css" data-minify="1"><meta name="dc.title" content="Recette cake marbré | L'atelier de Roxane"><meta name="dc.description" content="Découvre ma recette facile et rapide de cake marbré façon Savane. Réalise un cake hyper moelleux au bon goût de vanille et chocolat. L'essayer c'est l'adopter. "><meta name="dc.relation" content="https://www.latelierderoxane.com/blog/recette-cake-marbre/"><meta name="dc.source" content="https://www.latelierderoxane.com/blog/"><meta name="dc.language" content="fr_FR"><meta name="description" content="Découvre ma recette facile et rapide de cake marbré façon Savane. Réalise un cake hyper moelleux au bon goût de vanille et chocolat. L'essayer c'est l'adopter. "><meta name="robots" content="index, follow"><meta name="googlebot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"><meta name="bingbot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"><link rel="canonical" href="https://www.latelierderoxane.com/blog/recette-cake-marbre/"><meta name="author" content="Alexia Cacozza"><meta property="og:url" content="https://www.latelierderoxane.com/blog/recette-cake-marbre/"><meta property="og:site_name" content="L'atelier de Roxane"><meta property="og:locale" content="fr_FR"><meta property="og:type" content="article"><meta property="og:title" content="Recette cake marbré | L'atelier de Roxane"><meta property="og:description" content="Découvre ma recette facile et rapide de cake marbré façon Savane. Réalise un cake hyper moelleux au bon goût de vanille et chocolat. L'essayer c'est l'adopter. "><meta property="og:image" content="https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre..png"><meta property="og:image:secure_url" content="https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre..png"><meta property="og:image:width" content="2016"><meta property="og:image:height" content="1512"><meta property="og:image:alt" content="cake marbré"><link rel="dns-prefetch" href="//www.google.com"> <script type="text/javascript" async="" src="https://www.gstatic.com/recaptcha/releases/2uoiJ4hP3NUoP9v_eBNfU6CR/recaptcha__fr.js" crossorigin="anonymous" integrity="sha384-kvn756g+b9/+GfnYlqbC+fTMjz4KqSEcyHQAKFu+posiJx5kSuNATAjCET9WiVJF"></script><script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.latelierderoxane.com\/blog"},{"@type":"ListItem","position":2,"name":"Recettes","item":"https:\/\/www.latelierderoxane.com\/blog\/recettes\/"},{"@type":"ListItem","position":3,"name":"Recette cake marbr\u00e9","item":"https:\/\/www.latelierderoxane.com\/blog\/recette-cake-marbre\/"}]}</script> <link rel="alternate" type="application/rss+xml" title="L'atelier de Roxane » Recette cake marbré Flux des commentaires" href="https://www.latelierderoxane.com/blog/recette-cake-marbre/feed/"><style id="rocket-lazyload-inline-css" type="text/css">.rll-youtube-player{position:relative;padding-bottom:56.23%;height:0;overflow:hidden;max-width:100%}.rll-youtube-player iframe{position:absolute;top:0;left:0;width:100%;height:100%;z-index:100;background:0 0}.rll-youtube-player img{bottom:0;display:block;left:0;margin:auto;max-width:100%;width:100%;position:absolute;right:0;top:0;border:none;height:auto;cursor:pointer;-webkit-transition:.4s all;-moz-transition:.4s all;transition:.4s all}.rll-youtube-player img:hover{-webkit-filter:brightness(75%)}.rll-youtube-player .play{height:72px;width:72px;left:50%;top:50%;margin-left:-36px;margin-top:-36px;position:absolute;background:url(https://www.latelierderoxane.com/blog/wp-content/plugins/wp-rocket/assets/img/youtube.png) no-repeat;cursor:pointer}</style> <script type="text/javascript" src="https://www.latelierderoxane.com/blog/wp-content/cache/busting/1/blog/wp-includes/js/jquery/jquery.min-3.6.0.js" id="jquery-core-js"></script> <link rel="https://api.w.org/" href="https://www.latelierderoxane.com/blog/wp-json/"><link rel="alternate" type="application/json" href="https://www.latelierderoxane.com/blog/wp-json/wp/v2/posts/1177"><link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://www.latelierderoxane.com/blog/wp-includes/wlwmanifest.xml"><link rel="shortlink" href="https://www.latelierderoxane.com/blog/?p=1177"><style>.breadcrumb{list-style:none;margin:0}.breadcrumb li{margin:0;display:inline;position:relative}.breadcrumb li::after{content:' - '}.breadcrumb li:last-child::after{display:none}</style><noscript><style id="rocket-lazyload-nojs-css">.rll-youtube-player,[data-lazy-src]{display:none!important}</style></noscript><link rel="icon" href="/favicon.ico">  <script async="" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7914438417007398" crossorigin="anonymous"></script> <style type="text/css">span.tarteaucitron-magic-block {background: #dfad8b;display: inline-block;padding: 25px;color: #222222;text-align: center;max-width: 400px;font-size: 14px;}span.tarteaucitron-magic-block b {font-size: 17px;}span.tarteaucitron-magic-block button {margin-top: 15px;}div#tarteaucitronAlertBig {box-sizing: border-box!important;}#tarteaucitron #tarteaucitronServices .tarteaucitronMainLine .tarteaucitronName a, #tarteaucitron #tarteaucitronServices .tarteaucitronTitle a {color: #222222 !important}#tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesList .tarteaucitronCookiesListMain:hover, #tarteaucitron #tarteaucitronServices .tarteaucitronLine:hover, html body #tarteaucitronRoot #tarteaucitron .tarteaucitronHidden:hover ul li {background: rgba(223, 173, 139, 0.2) !important;}#tarteaucitron #tarteaucitronServices .tarteaucitronHidden, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesList .tarteaucitronHidden {background: rgba(223, 173, 139, 0.07) !important}#tarteaucitron .tarteaucitronBorder, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesList .tarteaucitronCookiesListMain, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesList, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesList .tarteaucitronHidden, #tarteaucitron #tarteaucitronServices .tarteaucitronMainLine {border-color:#dfad8b !important}#tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesList .tarteaucitronCookiesListMain, #tarteaucitron #tarteaucitronServices .tarteaucitronLine, .tarteaucitron-toggle-group {background: rgba(223, 173, 139, 0.1) !important} #tarteaucitron #tarteaucitronServices .tarteaucitronMainLine .tarteaucitronName b, #tarteaucitronAlertBig #tarteaucitronDisclaimerAlert b, #tarteaucitronAlertSmall #tarteaucitronCookiesNumber, #tarteaucitronAlertSmall #tarteaucitronManager, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesTitle b, #tarteaucitron #tarteaucitronInfo a, html body #tarteaucitronRoot div#tarteaucitronInfo, #tarteaucitron .tarteaucitronH1, #tarteaucitron .tarteaucitronName tarteaucitronH2,#tarteaucitronAlertBig #tarteaucitronDisclaimerAlert strong, #tarteaucitron .tarteaucitronTitle button {color:#222222 !important} #tarteaucitron #tarteaucitronServices .tarteaucitronMainLine, #tarteaucitronAlertBig, #tarteaucitronAlertBig #tarteaucitronDisclaimerAlert, #tarteaucitronAlertSmall, .tac_activate, .tac_activate .tac_float, .tac_activate .tac_float b, #tarteaucitron #tarteaucitronClosePanel, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronClosePanelCookie, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesTitle, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesTitle:hover, #tarteaucitron #tarteaucitronInfo, #tarteaucitron #tarteaucitronServices .tarteaucitronDetails, #tarteaucitron #tarteaucitronServices .tarteaucitronTitle, #tarteaucitronAlertSmall #tarteaucitronCookiesListContainer #tarteaucitronCookiesList .tarteaucitronTitle, #tarteaucitron #tarteaucitronServices .tarteaucitronMainLine:hover, div#tarteaucitronServices, #tarteaucitron #tarteaucitronServices .tarteaucitronTitle button {background: #dfad8b !important;color:#222222 !important}#tarteaucitronAlertBig #tarteaucitronCloseAlert {color: #dfad8b !important;background:#222222 !important}html body #tarteaucitronRoot #tarteaucitronAlertBig, html body #tarteaucitronRoot span#tarteaucitronDisclaimerAlert{background-color:#dfad8b!important}html body #tarteaucitronRoot #tarteaucitronAlertBig span{color:#333333!important}html body #tarteaucitronRoot div#tarteaucitronAlertBig:before{color:#333333!important}html body #tarteaucitronRoot button.tarteaucitronAllow{background-color:#ffffff!important}html body .tac_activate .tac_float .tarteaucitronAllow {background-color:#ffffff!important}head .tarteaucitron-magic-block button {display: none;}.tarteaucitron-magic-block button {border-radius: 4px;background-color:#ffffff!important;cursor: pointer;display: inline-block;padding: 6px 10px;text-align: center;text-decoration: none;width: auto;border: 0;cursor:pointer;}html body #tarteaucitronRoot button.tarteaucitronAllow{color:#333333!important}html body .tac_activate .tac_float .tarteaucitronAllow, html body #tarteaucitronRoot .tarteaucitronCheck:before{color:#333333!important}.tarteaucitron-magic-block button {color:#333333!important}html body #tarteaucitronRoot button.tarteaucitronDeny{background-color:#ffffff!important}html body #tarteaucitronRoot button.tarteaucitronDeny{color:#333333!important}html body #tarteaucitronRoot .tarteaucitronCross:before{color:#333333!important}html body #tarteaucitronRoot #tarteaucitronCloseAlert{background-color:#ffffff!important}html body #tarteaucitronRoot #tarteaucitronCloseAlert{color:#333333!important}html body #tarteaucitronRoot #tarteaucitronPrivacyUrl{background-color:#dfad8b!important}html body #tarteaucitronRoot #tarteaucitronPrivacyUrl{color:#333333!important}html body #tarteaucitronRoot li.tarteaucitronLine.tarteaucitronIsAllowed{border-color:#1c870b!important}html body #tarteaucitronRoot li.tarteaucitronLine.tarteaucitronIsDenied{border-color:#9C1A1A!important}html body #tarteaucitronRoot #tarteaucitronDotGreen{background-color:#1c870b!important}html body #tarteaucitronRoot #tarteaucitronDotRed{background-color:#9c1a1a!important}</style><link rel="stylesheet" type="text/css" href="https://tarteaucitron.io/cache/css/tarteaucitron.css?v=20210509"><script id="" async="" src="https://tarteaucitron.io/cache/lang/tarteaucitron.en.js?v=20210509"></script><script id="" async="" src="https://tarteaucitron.io/cache/tarteaucitron.services.js?v=20210509"></script><style>.tarteaucitronTitle{display:none}</style></head><body class="post-template-default single single-post postid-1177 single-format-standard" itemscope="" itemtype="http://schema.org/WebPage"><header id="header" role="banner" itemscope="" itemtype="http://schema.org/WPHeader"><div class="inner"> <a id="logo" href="https://www.latelierderoxane.com/blog/" title="L'atelier de Roxane" itemprop="headline"> <img src="https://www.latelierderoxane.com/blog/wp-content/uploads/logo-roxane.svg" alt="L'atelier de Roxane" data-lazy-src="https://www.latelierderoxane.com/blog/wp-content/uploads/logo-roxane.svg" class="lazyloaded" data-was-processed="true"><noscript><img src="https://www.latelierderoxane.com/blog/wp-content/uploads/logo-roxane.svg" alt="L&#039;atelier de Roxane"/></noscript> </a><nav class="main" role="navigation" itemscope="" itemtype="http://schema.org/SiteNavigationElement"><ul id="menu-principal" class="menu unstyled txtright"><li id="menu-item-687" class="menu-item menu-item-type-post_type menu-item-object-page current_page_parent menu-item-687 current-menu-item active"><a href="https://www.latelierderoxane.com/blog/recettes/">Recettes</a></li><li id="menu-item-686" class="menu-item menu-item-type-post_type_archive menu-item-object-actualites menu-item-686 "><a href="https://www.latelierderoxane.com/blog/actualites/">Actualités</a></li><li id="menu-item-279" class="btn menu-item menu-item-type-custom menu-item-object-custom menu-item-279 "><a href="https://www.latelierderoxane.com/">Retour à la boutique</a></li></ul></nav></div></header><section><main id="main" role="main"><article id="post-1177" class="post-1177 post type-post status-publish format-standard has-post-thumbnail category-gouters-maison" itemscope="" itemtype="http://schema.org/Article"><div class="bloc_container"><div id="breadcrumbs" class="inner"><nav aria-label="Fil d'Ariane"><ol class="breadcrumb" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumb-item" itemprop="itemListElement" itemscope="" itemtype="https://schema.org/ListItem"><a itemscope="" itemtype="http://schema.org/WebPage" itemprop="item" itemid="https://www.latelierderoxane.com/blog" href="https://www.latelierderoxane.com/blog"><span itemprop="name">Accueil</span></a><meta itemprop="position" content="1"></li><li class="breadcrumb-item" itemprop="itemListElement" itemscope="" itemtype="https://schema.org/ListItem"><a itemscope="" itemtype="http://schema.org/WebPage" itemprop="item" itemid="https://www.latelierderoxane.com/blog/recettes/" href="https://www.latelierderoxane.com/blog/recettes/"><span itemprop="name">Recettes</span></a><meta itemprop="position" content="2"></li><li class="breadcrumb-item active" aria-current="page" itemprop="itemListElement" itemscope="" itemtype="https://schema.org/ListItem"><span itemprop="name">Recette cake marbré</span><meta itemprop="position" content="3"></li></ol></nav></div><div class="inner"><div class="sidebar"> <ins class="adsbygoogle" style="display:block; width: 263px; margin-bottom: 2em;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="5192022518" data-ad-format="auto" data-full-width-responsive="true"><iframe id="aswift_0" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame0" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>  <ins class="adsbygoogle" style="display:block; width: 263px; margin-bottom: 2em;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="1033020696" data-ad-format="auto" data-full-width-responsive="true"><iframe id="aswift_1" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame1" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>  <ins class="adsbygoogle" style="display:block; width: 263px; margin-bottom: 2em;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="6244328237" data-ad-format="auto" data-full-width-responsive="true"><iframe id="aswift_2" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame2" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> </div><div class="contenu"><div class="bloc_hdp"> <img src="https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre.-787x590.png" class="attachment-single size-single wp-post-image" alt="cake marbré" loading="lazy" srcset="https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre.-787x590.png 787w, https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre.-300x225.png 300w, https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre.-1024x768.png 1024w, https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre.-768x576.png 768w, https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre.-1536x1152.png 1536w, https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre.-667x500.png 667w, https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre..png 2016w" sizes="(max-width: 787px) 100vw, 787px" width="787" height="590"></div><div class="texte"><div class="bloc_titreh1 bloc_blog"><h1>Recette cake marbré</h1></div><div class="bloc_chapeau bloc_blog"><p>Je pense que nous avons déjà tous acheté, au moins une fois, un cake Savane au supermarché ! Un délicieux marbré, moelleux à souhait au bon goût de vanille et cacao. Aujourd’hui, je te propose une recette facile et rapide pour réaliser ce fameux cake marbré maison ! Réalise cette recette et tu n’achèteras plus l’industriel 😉</p></div><div class="bloc_temps bloc_blog"><div class="infos"><div> <span class="titre">Temps total</span> <span class="valeur">60 min </span></div><div> <span class="titre">Préparation</span> <span class="valeur">15 min </span></div><div> <span class="titre">Cuisson</span> <span class="valeur">45 min </span></div><div> <span class="titre">Niveau</span> <span class="valeur">Facile</span></div><div> <span class="titre">Personnes</span> <span class="valeur"> 6/8 </span></div></div></div><div class="bloc_ingredients bloc_blog"><h2>Ingrédients</h2><div class="ingredients"><div class="ingredient"><p><input type="checkbox">3 œufs</p></div><div class="ingredient"><p><input type="checkbox">70 g de sucre</p></div><div class="ingredient"><p><input type="checkbox">70 g de beurre  fondu</p></div><div class="ingredient"><p><input type="checkbox">1 sachet de levure chimique</p></div><div class="ingredient"><p><input type="checkbox">250 g de farine</p></div><div class="ingredient"><p><input type="checkbox">150 g de lait</p></div><div class="ingredient"><p><input type="checkbox">150 g de chocolat noir fondu</p></div><div class="ingredient"><p><input type="checkbox">1 càc d'arôme ou poudre de vanille</p></div></div></div><div class="bloc_texte_simple bloc_blog"><h2>Préparation</h2><ul><li class="p1">Préchauffe le four à 165°.</li><li class="p1">Dans le bol de ton robot, verse les œufs, le sucre et fouette pendant 5 minutes. Ton mélange doit s’éclaircir et doubler de volume. Tu peux également utiliser un batteur électrique.</li><li class="p1">Ajoute le beurre fondu, la levure, la farine et fouette le tout.</li><li class="p1">Verse le lait et fouette à nouveau jusqu’à l’obtention d’un mélange homogène.</li><li class="p1">Sépare la préparation dans deux bols différents de manière égale.</li><li class="p1">Ajoute l’arôme ou la poudre de vanille dans le premier bol et mélange le tout.</li><li>Verse le chocolat fondu dans le second bol et mélange à la maryse pour bien l’incorporer.</li><li>Beurre ton moule à cake.</li><li>Verse, dans le fond du moule, la moitié de la pâte à la vanille puis la moitié de la pâte au chocolat.</li><li>Renouvèle la même opération une deuxième fois.</li><li>Enfourne pendant 45 min. Vérifie la cuisson à l’aide d’un couteau, la lame doit ressortir sèche.</li><li>Laisse tiédir ton cake et démoule-le.</li></ul></div><div class="bloc_texte_simple bloc_blog"><h2>Mon conseil</h2><p>Tu peux conserver ce cake marbré, emballé dans du film alimentaire, au frais, jusqu’à&nbsp; 7 jours. Sors-le quelques instants avant de la déguster pour qu’il retrouve son moelleux.</p></div><div class="bloc_telechargement bloc_blog"> <a href="https://www.latelierderoxane.com/blog/wp-content/uploads/recette-cake-marbre-.pdf" class="telechargement" target="_blank"> <i class="fas fa-cloud-download-alt"></i> Télécharge la recette </a></div></div><div class="social"><ul class="share_buttons"><li><a href="https://www.facebook.com/sharer/sharer.php?u=https://www.latelierderoxane.com/blog/recette-cake-marbre/" target="_blank" title="Facebook"><i class="fab fa-facebook-f"></i></a></li><li><a href="https://twitter.com/intent/tweet?text=Recette cake marbré+https://www.latelierderoxane.com/blog/recette-cake-marbre/" target="_blank" title="Twitter"><i class="fab fa-twitter"></i></a></li><li><a href="https://pinterest.com/pin/create/button/?url=https://www.latelierderoxane.com/blog/recette-cake-marbre/" target="_blank" title="Pinterest"><i class="fab fa-pinterest"></i></a></li><li><a href="https://www.instagram.com/latelierderoxane/" target="_blank" title="Instagram"><i class="fab fa-instagram"></i></a></li><li><a href="https://api.whatsapp.com/send?text=https://www.latelierderoxane.com/blog/recette-cake-marbre/" target="_blank" title="Whatsapp"><i class="fab fa-whatsapp"></i></a></li></ul></div> <ins class="adsbygoogle" style="display:block; margin-top:2em;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="9262686894" data-ad-format="auto" data-full-width-responsive="true"><iframe id="aswift_3" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame3" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> </div></div><div class="inner"><div class="liste_articles more"><div class="titre"><h2> VOUS AIMEREZ AUSSI</h2></div><div class="grid-4-large-3-medium-2-small-1"><article id="post-1139" class="wow fadeIn mbl post-1139 post type-post status-publish format-standard has-post-thumbnail category-a-partager" data-wow-delay="150ms" itemscope="" itemtype="http://schema.org/Article" style="visibility: visible; animation-delay: 150ms; animation-name: fadeIn;"><a href="https://www.latelierderoxane.com/blog/recette-tiramisu/"> <span class="cat"> À partager </span> <img src="https://www.latelierderoxane.com/blog/wp-content/uploads/tiramisu--642x589.png" class="attachment-archive size-archive wp-post-image" alt="recette tiramisu" loading="lazy" width="642" height="589"><div class="texte"> <strong class="h2-like">Recette tiramisu</strong><div class="details"><div class="infos"> <span><i class="far fa-clock"></i>25 min + repos</span> <span><i class="far fa-user"></i>6/8</span></div> <time class="date" itemprop="datePublished" datetime="2022-02-22T13:13:58+01:00">22 février 2022</time></div></div> </a></article> <ins class="adsbygoogle" style="display:inline-block; height:320px;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="5172695818"><iframe id="aswift_4" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame4" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> <article id="post-1127" class="wow fadeIn mbl post-1127 post type-post status-publish format-standard has-post-thumbnail category-recettes-express" data-wow-delay="150ms" itemscope="" itemtype="http://schema.org/Article" style="visibility: visible; animation-delay: 150ms; animation-name: fadeIn;"><a href="https://www.latelierderoxane.com/blog/recette-mousse-au-chocolat/"> <span class="cat"> Recettes express </span> <img src="https://www.latelierderoxane.com/blog/wp-content/uploads/mousse-au-chocolat-642x589.png" class="attachment-archive size-archive wp-post-image" alt="mousse au chocolat" loading="lazy" width="642" height="589"><div class="texte"> <strong class="h2-like">Recette mousse au chocolat</strong><div class="details"><div class="infos"> <span><i class="far fa-clock"></i>2 h 15</span> <span><i class="far fa-user"></i>4 mousses au chocolat </span></div> <time class="date" itemprop="datePublished" datetime="">22 février 2022</time></div></div> </a></article> <ins class="adsbygoogle" style="display:inline-block; height:320px;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="5172695818"><iframe id="aswift_5" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame5" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> <article id="post-1075" class="wow fadeIn mbl post-1075 post type-post status-publish format-standard has-post-thumbnail category-recettes-express" data-wow-delay="150ms" itemscope="" itemtype="http://schema.org/Article" style="visibility: visible; animation-delay: 150ms; animation-name: fadeIn;"><a href="https://www.latelierderoxane.com/blog/recette-ganache-chocolat/"> <span class="cat"> Recettes express </span> <img src="https://www.latelierderoxane.com/blog/wp-content/uploads/ganache-chocolat-642x589.png" class="attachment-archive size-archive wp-post-image" alt="recette ganache chocolat" loading="lazy" width="642" height="589"><div class="texte"> <strong class="h2-like">Recette ganache chocolat</strong><div class="details"><div class="infos"> <span><i class="far fa-clock"></i>15 min</span> <span><i class="far fa-user"></i>Pour 1 bol </span></div> <time class="date" itemprop="datePublished" datetime="2022-01-26T14:38:28+01:00">26 janvier 2022</time></div></div> </a></article> <ins class="adsbygoogle" style="display:inline-block; height:320px;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="5172695818"><iframe id="aswift_6" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame6" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> <article id="post-1062" class="wow fadeIn mbl post-1062 post type-post status-publish format-standard has-post-thumbnail category-a-partager" data-wow-delay="150ms" itemscope="" itemtype="http://schema.org/Article" style="visibility: visible; animation-delay: 150ms; animation-name: fadeIn;"><a href="https://www.latelierderoxane.com/blog/recette-meringue/"> <span class="cat"> À partager </span> <img src="https://www.latelierderoxane.com/blog/wp-content/uploads/meringue-642x589.png" class="attachment-archive size-archive wp-post-image" alt="Recette meringue" loading="lazy" width="642" height="589"><div class="texte"> <strong class="h2-like">Recette meringues</strong><div class="details"><div class="infos"> <span><i class="far fa-clock"></i>1h40</span> <span><i class="far fa-user"></i>15 meringues </span></div> <time class="date" itemprop="datePublished" datetime="">26 janvier 2022</time></div></div> </a></article> <ins class="adsbygoogle" style="display:inline-block; height:320px;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="5172695818"><iframe id="aswift_7" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame7" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> </div></div></div></div></article></main></section><ins class="adsbygoogle inner" style="display:block; margin-bottom:35px;" data-ad-client="ca-pub-7914438417007398" data-ad-slot="9897554288" data-ad-format="auto" data-full-width-responsive="true"><iframe id="aswift_8" style="height: 1px !important; max-height: 1px !important; max-width: 1px !important; width: 1px !important;"><iframe id="google_ads_frame8" style=""></iframe></iframe></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> <footer id="footer" role="contentinfo" itemscope="" itemtype="http://schema.org/WPFooter"><div class="inner"><div class="line"> <a id="logo" href="https://www.latelierderoxane.com/blog/" title="L'atelier de Roxane" itemprop="headline"> <img src="https://www.latelierderoxane.com/blog/wp-content/uploads/logo-roxane.svg" alt="L'atelier de Roxane" data-lazy-src="https://www.latelierderoxane.com/blog/wp-content/uploads/logo-roxane.svg" class="lazyloaded" data-was-processed="true"><noscript><img src="https://www.latelierderoxane.com/blog/wp-content/uploads/logo-roxane.svg" alt="L&#039;atelier de Roxane"/></noscript> </a></div><nav class="copyrights" role="navigation" itemscope="" itemtype="http://schema.org/SiteNavigationElement"><ul id="menu-copyrights" class="unstyled txtcenter"><li id="menu-item-123" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-123 "><a href="https://www.latelierderoxane.com/blog/plan-du-site/">Plan du site</a></li></ul></nav></div></footer><nav class="mobile" role="navigation"> <input type="checkbox" id="open_menu_mobile"> <label for="open_menu_mobile"><span></span><span></span><span></span></label><div><ul id="menu_mobile_1" class="unstyled"><li class="menu-item menu-item-type-post_type menu-item-object-page current_page_parent menu-item-687 current-menu-item active"><a href="https://www.latelierderoxane.com/blog/recettes/">Recettes</a></li><li class="menu-item menu-item-type-post_type_archive menu-item-object-actualites menu-item-686 "><a href="https://www.latelierderoxane.com/blog/actualites/">Actualités</a></li><li class="btn menu-item menu-item-type-custom menu-item-object-custom menu-item-279 "><a href="https://www.latelierderoxane.com/">Retour à la boutique</a></li></ul></div></nav> <script type="text/javascript" async="" defer="" src="https://www.google.com/recaptcha/api.js?onload=renderInvisibleReCaptcha&amp;render=explicit" id="google-invisible-recaptcha-js"></script> <script>window.lazyLoadOptions = {
+                elements_selector: "img[data-lazy-src],.rocket-lazyload,iframe[data-lazy-src]",
+                data_src: "lazy-src",
+                data_srcset: "lazy-srcset",
+                data_sizes: "lazy-sizes",
+                class_loading: "lazyloading",
+                class_loaded: "lazyloaded",
+                threshold: 300,
+                callback_loaded: function(element) {
+                    if ( element.tagName === "IFRAME" && element.dataset.rocketLazyload == "fitvidscompatible" ) {
+                        if (element.classList.contains("lazyloaded") ) {
+                            if (typeof window.jQuery != "undefined") {
+                                if (jQuery.fn.fitVids) {
+                                    jQuery(element).parent().fitVids();
+                                }
+                            }
+                        }
+                    }
+                }};
+        window.addEventListener('LazyLoad::Initialized', function (e) {
+            var lazyLoadInstance = e.detail.instance;
+        
+            if (window.MutationObserver) {
+                var observer = new MutationObserver(function(mutations) {
+                    mutations.forEach(function(mutation) {
+                        for (i = 0; i < mutation.addedNodes.length; i++) {
+                            if (typeof mutation.addedNodes[i].getElementsByTagName !== 'function') {
+                                return;
+                            }
+
+                           if (typeof mutation.addedNodes[i].getElementsByClassName !== 'function') {
+                                return;
+                            }
+
+                            imgs = mutation.addedNodes[i].getElementsByTagName('img');
+                            iframes = mutation.addedNodes[i].getElementsByTagName('iframe');
+                            rocket_lazy = mutation.addedNodes[i].getElementsByClassName('rocket-lazyload');
+
+                            if ( 0 === imgs.length && 0 === iframes.length && 0 === rocket_lazy.length ) {
+                                return;
+                            }
+
+                            lazyLoadInstance.update();
+                        }
+                    } );
+                } );
+                
+                var b      = document.getElementsByTagName("body")[0];
+                var config = { childList: true, subtree: true };
+                
+                observer.observe(b, config);
+            }
+        }, false);</script><script data-no-minify="1" async="" src="https://www.latelierderoxane.com/blog/wp-content/plugins/wp-rocket/assets/js/lazyload/11.0.6/lazyload.min.js"></script><script src="https://www.latelierderoxane.com/blog/wp-content/cache/min/1/0a431e87244cd24d95a763b3db9b9e3f.js" data-minify="1" defer=""></script>
+<div id="tarteaucitronRoot"><div id="tarteaucitronPremium"></div><button type="button" id="tarteaucitronBack" aria-label="Close" title="Close"></button><div id="tarteaucitron" role="dialog" aria-modal="true" aria-describedby="tarteaucitronInfo" aria-labelledby="dialogTitle" tabindex="-1">   <button type="button" id="tarteaucitronClosePanel">       Close   </button>   <div id="tarteaucitronServices">      <div class="tarteaucitronLine tarteaucitronMainLine" id="tarteaucitronMainLineOffset">         <span class="tarteaucitronH1" role="heading" aria-level="1" id="dialogTitle">Cookies management panel</span>         <div id="tarteaucitronInfo">         By allowing these third party services, you accept their cookies and the use of tracking technologies necessary for their proper functioning.   <br><br>   <button type="button" id="tarteaucitronPrivacyUrlDialog" role="link">       Privacy policy   </button>         </div>         <div class="tarteaucitronName">            <span class="tarteaucitronH2" role="heading" aria-level="2">Preference for all services</span>         </div>         <div class="tarteaucitronAsk" id="tarteaucitronScrollbarAdjust">            <button type="button" id="tarteaucitronAllAllowed" class="tarteaucitronAllow">               <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow all cookies            </button>             <button type="button" id="tarteaucitronAllDenied" class="tarteaucitronDeny">               <span class="tarteaucitronCross" aria-hidden="true"></span> Deny all cookies            </button>         </div>      </div>      <div class="tarteaucitronBorder">         <div class="clear"></div><ul><li id="tarteaucitronServicesTitle_mandatory"><div class="tarteaucitronTitle">   <button type="button" tabindex="-1"><span class="tarteaucitronPlus" aria-hidden="true"></span> Mandatory cookies</button></div><ul id="tarteaucitronServices_mandatory"><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="3">This site uses cookies necessary for its proper functioning which cannot be deactivated.</span>       <span class="tarteaucitronListCookies" aria-hidden="true"></span><br>   </div>   <div class="tarteaucitronAsk">       <button type="button" class="tarteaucitronAllow" tabindex="-1" disabled="">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" class="tarteaucitronDeny" style="visibility:hidden" tabindex="-1">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>    </div></li></ul></li>         <li id="tarteaucitronServicesTitle_api" class="tarteaucitronHidden">            <div class="tarteaucitronTitle">               <button type="button" class="catToggleBtn" data-cat="tarteaucitronDetailsapi" data-index="0"><span class="tarteaucitronPlus" aria-hidden="true"></span> APIs</button>            </div>            <div id="tarteaucitronDetailsapi" class="tarteaucitronDetails tarteaucitronInfoBox">               APIs are used to load scripts: geolocation, search engines, translations, ...            </div>         <ul><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="2">APIs</span>       <span>APIs are used to load scripts: geolocation, search engines, translations, ...</span>   <button type="button" aria-expanded="false" class="tarteaucitron-toggle-group" id="tarteaucitron-toggle-group-api">Manage services (0)</button>   </div>   <div class="tarteaucitronAsk tarteaucitronIsDenied" id="tarteaucitron-group-api">       <button type="button" aria-label="Allow APIs" class="tarteaucitronAllow" id="tarteaucitron-accept-group-api" aria-pressed="false">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" aria-label="Deny APIs" class="tarteaucitronDeny" id="tarteaucitron-reject-group-api" aria-pressed="true">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>   </div></li></ul><ul id="tarteaucitronServices_api" style="display: none;"></ul></li>         <li id="tarteaucitronServicesTitle_ads" class="tarteaucitronHidden">            <div class="tarteaucitronTitle">               <button type="button" class="catToggleBtn" data-cat="tarteaucitronDetailsads" data-index="1"><span class="tarteaucitronPlus" aria-hidden="true"></span> Advertising network</button>            </div>            <div id="tarteaucitronDetailsads" class="tarteaucitronDetails tarteaucitronInfoBox">               Ad networks can generate revenue by selling advertising space on the site.            </div>         <ul><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="2">Advertising network</span>       <span>Ad networks can generate revenue by selling advertising space on the site.</span>   <button type="button" aria-expanded="false" class="tarteaucitron-toggle-group" id="tarteaucitron-toggle-group-ads">Manage services (0)</button>   </div>   <div class="tarteaucitronAsk tarteaucitronIsDenied" id="tarteaucitron-group-ads">       <button type="button" aria-label="Allow Advertising network" class="tarteaucitronAllow" id="tarteaucitron-accept-group-ads" aria-pressed="false">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" aria-label="Deny Advertising network" class="tarteaucitronDeny" id="tarteaucitron-reject-group-ads" aria-pressed="true">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>   </div></li></ul><ul id="tarteaucitronServices_ads" style="display: none;"></ul></li>         <li id="tarteaucitronServicesTitle_analytic" class="tarteaucitronHidden">            <div class="tarteaucitronTitle">               <button type="button" class="catToggleBtn" data-cat="tarteaucitronDetailsanalytic" data-index="2"><span class="tarteaucitronPlus" aria-hidden="true"></span> Audience measurement</button>            </div>            <div id="tarteaucitronDetailsanalytic" class="tarteaucitronDetails tarteaucitronInfoBox">               The audience measurement services used to generate useful statistics attendance to improve the site.            </div>         <ul><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="2">Audience measurement</span>       <span>The audience measurement services used to generate useful statistics attendance to improve the site.</span>   <button type="button" aria-expanded="false" class="tarteaucitron-toggle-group" id="tarteaucitron-toggle-group-analytic">Manage services (0)</button>   </div>   <div class="tarteaucitronAsk tarteaucitronIsDenied" id="tarteaucitron-group-analytic">       <button type="button" aria-label="Allow Audience measurement" class="tarteaucitronAllow" id="tarteaucitron-accept-group-analytic" aria-pressed="false">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" aria-label="Deny Audience measurement" class="tarteaucitronDeny" id="tarteaucitron-reject-group-analytic" aria-pressed="true">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>   </div></li></ul><ul id="tarteaucitronServices_analytic" style="display: none;"></ul></li>         <li id="tarteaucitronServicesTitle_comment" class="tarteaucitronHidden">            <div class="tarteaucitronTitle">               <button type="button" class="catToggleBtn" data-cat="tarteaucitronDetailscomment" data-index="3"><span class="tarteaucitronPlus" aria-hidden="true"></span> Comments</button>            </div>            <div id="tarteaucitronDetailscomment" class="tarteaucitronDetails tarteaucitronInfoBox">               Comments managers facilitate the filing of comments and fight against spam.            </div>         <ul><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="2">Comments</span>       <span>Comments managers facilitate the filing of comments and fight against spam.</span>   <button type="button" aria-expanded="false" class="tarteaucitron-toggle-group" id="tarteaucitron-toggle-group-comment">Manage services (0)</button>   </div>   <div class="tarteaucitronAsk tarteaucitronIsDenied" id="tarteaucitron-group-comment">       <button type="button" aria-label="Allow Comments" class="tarteaucitronAllow" id="tarteaucitron-accept-group-comment" aria-pressed="false">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" aria-label="Deny Comments" class="tarteaucitronDeny" id="tarteaucitron-reject-group-comment" aria-pressed="true">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>   </div></li></ul><ul id="tarteaucitronServices_comment" style="display: none;"></ul></li>         <li id="tarteaucitronServicesTitle_other" class="tarteaucitronHidden">            <div class="tarteaucitronTitle">               <button type="button" class="catToggleBtn" data-cat="tarteaucitronDetailsother" data-index="4"><span class="tarteaucitronPlus" aria-hidden="true"></span> Other</button>            </div>            <div id="tarteaucitronDetailsother" class="tarteaucitronDetails tarteaucitronInfoBox">               Services to display web content.            </div>         <ul><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="2">Other</span>       <span>Services to display web content.</span>   <button type="button" aria-expanded="false" class="tarteaucitron-toggle-group" id="tarteaucitron-toggle-group-other">Manage services (0)</button>   </div>   <div class="tarteaucitronAsk tarteaucitronIsDenied" id="tarteaucitron-group-other">       <button type="button" aria-label="Allow Other" class="tarteaucitronAllow" id="tarteaucitron-accept-group-other" aria-pressed="false">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" aria-label="Deny Other" class="tarteaucitronDeny" id="tarteaucitron-reject-group-other" aria-pressed="true">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>   </div></li></ul><ul id="tarteaucitronServices_other" style="display: none;"></ul></li>         <li id="tarteaucitronServicesTitle_social" class="tarteaucitronHidden">            <div class="tarteaucitronTitle">               <button type="button" class="catToggleBtn" data-cat="tarteaucitronDetailssocial" data-index="5"><span class="tarteaucitronPlus" aria-hidden="true"></span> Social networks</button>            </div>            <div id="tarteaucitronDetailssocial" class="tarteaucitronDetails tarteaucitronInfoBox">               Social networks can improve the usability of the site and help to promote it via the shares.            </div>         <ul><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="2">Social networks</span>       <span>Social networks can improve the usability of the site and help to promote it via the shares.</span>   <button type="button" aria-expanded="false" class="tarteaucitron-toggle-group" id="tarteaucitron-toggle-group-social">Manage services (0)</button>   </div>   <div class="tarteaucitronAsk tarteaucitronIsDenied" id="tarteaucitron-group-social">       <button type="button" aria-label="Allow Social networks" class="tarteaucitronAllow" id="tarteaucitron-accept-group-social" aria-pressed="false">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" aria-label="Deny Social networks" class="tarteaucitronDeny" id="tarteaucitron-reject-group-social" aria-pressed="true">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>   </div></li></ul><ul id="tarteaucitronServices_social" style="display: none;"></ul></li>         <li id="tarteaucitronServicesTitle_support" class="tarteaucitronHidden">            <div class="tarteaucitronTitle">               <button type="button" class="catToggleBtn" data-cat="tarteaucitronDetailssupport" data-index="6"><span class="tarteaucitronPlus" aria-hidden="true"></span> Support</button>            </div>            <div id="tarteaucitronDetailssupport" class="tarteaucitronDetails tarteaucitronInfoBox">               Support services allow you to get in touch with the site team and help to improve it.            </div>         <ul><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="2">Support</span>       <span>Support services allow you to get in touch with the site team and help to improve it.</span>   <button type="button" aria-expanded="false" class="tarteaucitron-toggle-group" id="tarteaucitron-toggle-group-support">Manage services (0)</button>   </div>   <div class="tarteaucitronAsk tarteaucitronIsDenied" id="tarteaucitron-group-support">       <button type="button" aria-label="Allow Support" class="tarteaucitronAllow" id="tarteaucitron-accept-group-support" aria-pressed="false">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" aria-label="Deny Support" class="tarteaucitronDeny" id="tarteaucitron-reject-group-support" aria-pressed="true">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>   </div></li></ul><ul id="tarteaucitronServices_support" style="display: none;"></ul></li>         <li id="tarteaucitronServicesTitle_video" class="tarteaucitronHidden">            <div class="tarteaucitronTitle">               <button type="button" class="catToggleBtn" data-cat="tarteaucitronDetailsvideo" data-index="7"><span class="tarteaucitronPlus" aria-hidden="true"></span> Videos</button>            </div>            <div id="tarteaucitronDetailsvideo" class="tarteaucitronDetails tarteaucitronInfoBox">               Video sharing services help to add rich media on the site and increase its visibility.            </div>         <ul><li class="tarteaucitronLine">   <div class="tarteaucitronName">       <span class="tarteaucitronH3" role="heading" aria-level="2">Videos</span>       <span>Video sharing services help to add rich media on the site and increase its visibility.</span>   <button type="button" aria-expanded="false" class="tarteaucitron-toggle-group" id="tarteaucitron-toggle-group-video">Manage services (0)</button>   </div>   <div class="tarteaucitronAsk tarteaucitronIsDenied" id="tarteaucitron-group-video">       <button type="button" aria-label="Allow Videos" class="tarteaucitronAllow" id="tarteaucitron-accept-group-video" aria-pressed="false">           <span class="tarteaucitronCheck" aria-hidden="true"></span> Allow       </button>        <button type="button" aria-label="Deny Videos" class="tarteaucitronDeny" id="tarteaucitron-reject-group-video" aria-pressed="true">           <span class="tarteaucitronCross" aria-hidden="true"></span> Deny       </button>   </div></li></ul><ul id="tarteaucitronServices_video" style="display: none;"></ul></li>             <li id="tarteaucitronNoServicesTitle" class="tarteaucitronLine">This website does not use any cookie requiring your consent.</li>         </ul>         <div class="tarteaucitronHidden tarteaucitron-spacer-20" id="tarteaucitronScrollbarChild"></div>     <a class="tarteaucitronSelfLink" href="https://tarteaucitron.io/" rel="nofollow noreferrer noopener" target="_blank" title="tarteaucitron (new window)"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHcAAAAeCAYAAAAWwoEYAAADl0lEQVRoge1Y0W3bQAx9CjKARlC+9GVUmqDJBHEmiDyB6wkcTxBngtgTxJ0gzgQW4C/9aYOmE6g4lTQo+k6y3Rb94QOERNQd+cjj8XiGwWAwGAwGg8FgMBgMBoPB8F8RNRXe+whEKe7c36ZCAeCRxC9Rig2PUd8kPgAsoxSfQ3YAzAA8D/HwYYCb05kBKKO0teFkmbC1jlKsAnq/Abjn+QBqAIsoRS30ttwG/HNz1wH/XIxWTicLdvtW7xTAGEAMtP685CNsBTe2d/BLydfXAG57SEnMAST0zgYZSUCPk02bCvkJduIzuJzDLfPolbY+tLKmar+/8+IRePy4qdpE03qHuH8fipFb4N2+XdA3AJ/0vaQxt7s9FvkIS2XvtqnwM0rxpOQfbnE5G2LhTCmUO2fHIngOmcv+KG3HafDchB6ntwjYqenR2PqC7sOZ3E7FXHB0vqxoFyUyLh7OEH7LOGouvhhN3eIBeKXv0n5MsufdHqXcwYR5U2EbpV35lSspVPJmQj4TcgRK7jTg5IzmPUhhwM5a2WHUFCx+NgiDucmgh7idikLovHFlL0pxQ9xzX+IIP9Y6FrJsqhjlQpZRAkFVDCjZfcCHt6bqJDmuh5ylCWx0RVnk3oumaknqTH5sqrY0fBWyULaHUIgAgxb46MxV3DbieAhxOxUxjSuljig9lMQ/Bcfoi9BTEv9aLORSndVxYOH525sUDC6u2gWxcNzBNRxPanyh3ktKinOgy3WoxPbtUM0t6RkbQnzBnFPgi9GCOEubY9UffIryz9iKRe8s/FUfEWosJJGxagp85bpUO3VywQ46lOtAWfNxKwa4JXQ+628+bpxYGXXMzp5rXH401VEyXwIdowXFaKWSMFHvMTVmGnc+P3oXV2QOiBCfgex8QtcQCbcQE/H+eoHzrkFo1KM7zVO4jVVj5s6lRiWF7zyXyfRMc97J3tzj87mYqZ7E2YjzUct9GUi4tjHLR8dVkBLjQcuHFleWvQfRNEhFR7uX7pkctOwvZXsft7sAtyldEUIN2UTeLxnEfxKYswzdi88BdbZ8hifUoSMftQvP+muRwN6+Q3DeqqRExP9QmTtcheiHh0Ot1x2i2km1bP9pbufw5zZdyWsOrh7vQae5OZWbsMv30pi7cd/CKj3coPEVaCP4Zhx4eQWhOZ1Y9MTXGyP8/iGjEyfa1T4fO/4Lea9vBoPBYDAYDAaDwWAwGAwGwz8GgF8siXCCbrSRhgAAAABJRU5ErkJggg==" alt="tarteaucitron.io"></a>       </div>   </div></div><div tabindex="-1" id="tarteaucitronAlertBig" class="tarteaucitronAlertBigBottom" style="opacity: 0; display: none;">   <span id="tarteaucitronDisclaimerAlert">       This site uses cookies and gives you control over what you want to activate   </span>   <button type="button" class="tarteaucitronCTAButton tarteaucitronAllow" id="tarteaucitronPersonalize2">       <span class="tarteaucitronCheck" aria-hidden="true"></span> OK, accept all   </button>   <button type="button" class="tarteaucitronCTAButton tarteaucitronDeny" id="tarteaucitronAllDenied2">       <span class="tarteaucitronCross" aria-hidden="true"></span> Deny all cookies   </button>   <button type="button" id="tarteaucitronCloseAlert" aria-label="Personalize (modal window)" title="Personalize (modal window)">       Personalize   </button>   <button type="button" id="tarteaucitronPrivacyUrl" role="link">       Privacy policy   </button></div><div id="tarteaucitronPercentage" style="display: none;"></div></div></body></html>
diff --git a/tests/test_latelierderoxane.py b/tests/test_latelierderoxane.py
new file mode 100644
index 00000000..468d7967
--- /dev/null
+++ b/tests/test_latelierderoxane.py
@@ -0,0 +1,85 @@
+from recipe_scrapers.latelierderoxane import LAtelierDeRoxane
+from tests import ScraperTest
+
+# test recipe's URL
+# https://www.latelierderoxane.com/blog/recette-cake-marbre/
+
+
+class TestLAtelierDeRoxaneScraper(ScraperTest):
+
+    scraper_class = LAtelierDeRoxane
+
+    def test_host(self):
+        self.assertEqual("latelierderoxane.com", self.harvester_class.host())
+
+    def test_canonical_url(self):
+        self.assertEqual(
+            "https://www.latelierderoxane.com/blog/recette-cake-marbre/",
+            self.harvester_class.canonical_url(),
+        )
+
+    def test_image(self):
+        self.assertEqual(
+            "https://www.latelierderoxane.com/blog/wp-content/uploads/cake-marbre.-787x590.png",
+            self.harvester_class.image(),
+        )
+
+    def test_title(self):
+        self.assertEqual("Recette cake marbré", self.harvester_class.title())
+
+    def test_description(self):
+        self.assertEqual(
+            "Je pense que nous avons déjà tous acheté, au moins une fois, un cake Savane au supermarché ! Un délicieux marbré, moelleux à souhait au bon goût de vanille et cacao. Aujourd’hui, je te propose une recette facile et rapide pour réaliser ce fameux cake marbré maison ! Réalise cette recette et tu n’achèteras plus l’industriel 😉",
+            self.harvester_class.description(),
+        )
+
+    def test_total_time(self):
+        self.assertEqual(60, self.harvester_class.total_time())
+
+    def test_prep_time(self):
+        self.assertEqual(15, self.harvester_class.prep_time())
+
+    def test_cook_time(self):
+        self.assertEqual(45, self.harvester_class.cook_time())
+
+    def test_yields(self):
+        self.assertEqual("6 serving(s)", self.harvester_class.yields())
+
+    def test_ingredients(self):
+        self.assertEqual(
+            [
+                "3 œufs",
+                "70 g de sucre",
+                "70 g de beurre  fondu",
+                "1 sachet de levure chimique",
+                "250 g de farine",
+                "150 g de lait",
+                "150 g de chocolat noir fondu",
+                "1 càc d'arôme ou poudre de vanille",
+            ],
+            self.harvester_class.ingredients(),
+        )
+
+    def test_instructions(self):
+        self.assertEqual(
+            "\n".join(
+                [
+                    "Préchauffe le four à 165°.",
+                    "Dans le bol de ton robot, verse les œufs, le sucre et fouette pendant 5 minutes. Ton mélange doit s’éclaircir et doubler de volume. Tu peux également utiliser un batteur électrique.",
+                    "Ajoute le beurre fondu, la levure, la farine et fouette le tout.",
+                    "Verse le lait et fouette à nouveau jusqu’à l’obtention d’un mélange homogène.",
+                    "Sépare la préparation dans deux bols différents de manière égale.",
+                    "Ajoute l’arôme ou la poudre de vanille dans le premier bol et mélange le tout.",
+                    "Verse le chocolat fondu dans le second bol et mélange à la maryse pour bien l’incorporer.",
+                    "Beurre ton moule à cake.",
+                    "Verse, dans le fond du moule, la moitié de la pâte à la vanille puis la moitié de la pâte au chocolat.",
+                    "Renouvèle la même opération une deuxième fois.",
+                    "Enfourne pendant 45 min. Vérifie la cuisson à l’aide d’un couteau, la lame doit ressortir sèche.",
+                    "Laisse tiédir ton cake et démoule-le.",
+                ]
+            ),
+            self.harvester_class.instructions(),
+        )
+
+    def test_site_name(self):
+        self.assertEqual("L'Atelier de Roxane", self.harvester_class.site_name())