diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+## 1.6.2
+
+* Add byLabel-related functions like byLabelContain
+[#1482](https://github.com/yesodweb/yesod/pull/1482)
+
 ## 1.6.1
 
 * Fix the build with `base-4.11` (GHC 8.4).
diff --git a/Yesod/Test.hs b/Yesod/Test.hs
--- a/Yesod/Test.hs
+++ b/Yesod/Test.hs
@@ -76,8 +76,14 @@
     -- on currently displayed label names.
     , byLabel
     , byLabelExact
+    , byLabelContain
+    , byLabelPrefix
+    , byLabelSuffix
     , fileByLabel
     , fileByLabelExact
+    , fileByLabelContain
+    , fileByLabelPrefix
+    , fileByLabelSuffix
 
     -- *** CSRF Tokens
     -- | In order to prevent CSRF exploits, yesod-form adds a hidden input
@@ -169,8 +175,8 @@
 type HasCallStack = (() :: Constraint)
 #endif
 
-{-# DEPRECATED byLabel "This function seems to have multiple bugs (ref: https://github.com/yesodweb/yesod/pull/1459). Use byLabelExact instead" #-}
-{-# DEPRECATED fileByLabel "This function seems to have multiple bugs (ref: https://github.com/yesodweb/yesod/pull/1459). Use fileByLabelExact instead" #-}
+{-# DEPRECATED byLabel "This function seems to have multiple bugs (ref: https://github.com/yesodweb/yesod/pull/1459). Use byLabelExact, byLabelContain, byLabelPrefix or byLabelSuffix instead" #-}
+{-# DEPRECATED fileByLabel "This function seems to have multiple bugs (ref: https://github.com/yesodweb/yesod/pull/1459). Use fileByLabelExact, fileByLabelContain, fileByLabelPrefix or fileByLabelSuffix instead" #-}
 
 -- | The state used in a single test case defined using 'yit'
 --
@@ -659,6 +665,48 @@
              -> RequestBuilder site ()
 byLabelExact = byLabelWithMatch (==)
 
+-- |
+-- Contain version of 'byLabelExact'
+--
+-- Note: Just like 'byLabel', this function throws an error if it finds multiple labels
+--
+-- @since 1.6.2
+byLabelContain :: T.Text -- ^ The text in the @\<label>@.
+               -> T.Text -- ^ The value to set the parameter to.
+               -> RequestBuilder site ()
+byLabelContain = byLabelWithMatch T.isInfixOf
+
+-- |
+-- Prefix version of 'byLabelExact'
+--
+-- Note: Just like 'byLabel', this function throws an error if it finds multiple labels
+--
+-- @since 1.6.2
+byLabelPrefix :: T.Text -- ^ The text in the @\<label>@.
+              -> T.Text -- ^ The value to set the parameter to.
+              -> RequestBuilder site ()
+byLabelPrefix = byLabelWithMatch T.isPrefixOf
+
+-- |
+-- Suffix version of 'byLabelExact'
+--
+-- Note: Just like 'byLabel', this function throws an error if it finds multiple labels
+--
+-- @since 1.6.2
+byLabelSuffix :: T.Text -- ^ The text in the @\<label>@.
+              -> T.Text -- ^ The value to set the parameter to.
+              -> RequestBuilder site ()
+byLabelSuffix = byLabelWithMatch T.isSuffixOf
+
+fileByLabelWithMatch  :: (T.Text -> T.Text -> Bool) -- ^ The matching method which is used to find labels (i.e. exact, contains)
+                      -> T.Text                     -- ^ The text contained in the @\<label>@.
+                      -> FilePath                   -- ^ The path to the file.
+                      -> T.Text                     -- ^ The MIME type of the file, e.g. "image/png".
+                      -> RequestBuilder site ()
+fileByLabelWithMatch match label path mime = do
+  name <- genericNameFromLabel match label
+  addFile name path mime
+
 -- | Finds the @\<label>@ with the given value, finds its corresponding @\<input>@, then adds a file for that input to the request body.
 --
 -- ==== __Examples__
@@ -687,9 +735,7 @@
             -> FilePath -- ^ The path to the file.
             -> T.Text -- ^ The MIME type of the file, e.g. "image/png".
             -> RequestBuilder site ()
-fileByLabel label path mime = do
-  name <- genericNameFromLabel T.isInfixOf label
-  addFile name path mime
+fileByLabel = fileByLabelWithMatch T.isInfixOf
 
 -- | Finds the @\<label>@ with the given value, finds its corresponding @\<input>@, then adds a file for that input to the request body.
 --
@@ -719,9 +765,43 @@
                  -> FilePath -- ^ The path to the file.
                  -> T.Text -- ^ The MIME type of the file, e.g. "image/png".
                  -> RequestBuilder site ()
-fileByLabelExact label path mime = do
-  name <- genericNameFromLabel (==) label
-  addFile name path mime
+fileByLabelExact = fileByLabelWithMatch (==)
+
+-- |
+-- Contain version of 'fileByLabelExact'
+--
+-- Note: Just like 'fileByLabel', this function throws an error if it finds multiple labels
+--
+-- @since 1.6.2
+fileByLabelContain :: T.Text -- ^ The text contained in the @\<label>@.
+                   -> FilePath -- ^ The path to the file.
+                   -> T.Text -- ^ The MIME type of the file, e.g. "image/png".
+                   -> RequestBuilder site ()
+fileByLabelContain = fileByLabelWithMatch T.isInfixOf
+
+-- |
+-- Prefix version of 'fileByLabelExact'
+--
+-- Note: Just like 'fileByLabel', this function throws an error if it finds multiple labels
+--
+-- @since 1.6.2
+fileByLabelPrefix :: T.Text -- ^ The text contained in the @\<label>@.
+                  -> FilePath -- ^ The path to the file.
+                  -> T.Text -- ^ The MIME type of the file, e.g. "image/png".
+                  -> RequestBuilder site ()
+fileByLabelPrefix = fileByLabelWithMatch T.isPrefixOf
+
+-- |
+-- Suffix version of 'fileByLabelExact'
+--
+-- Note: Just like 'fileByLabel', this function throws an error if it finds multiple labels
+--
+-- @since 1.6.2
+fileByLabelSuffix :: T.Text -- ^ The text contained in the @\<label>@.
+                  -> FilePath -- ^ The path to the file.
+                  -> T.Text -- ^ The MIME type of the file, e.g. "image/png".
+                  -> RequestBuilder site ()
+fileByLabelSuffix = fileByLabelWithMatch T.isSuffixOf
 
 -- | Lookups the hidden input named "_token" and adds its value to the params.
 -- Receives a CSS selector that should resolve to the form element containing the token.
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -30,6 +30,7 @@
 import Data.Monoid ((<>))
 import Control.Applicative
 import Network.Wai (pathInfo, requestHeaders)
+import Network.Wai.Test (SResponse(simpleBody))
 import Data.Maybe (fromMaybe)
 import Data.Either (isLeft, isRight)
 
@@ -218,7 +219,7 @@
                     setMethod "POST"
                     setUrl ("/labels" :: Text)
                     byLabel "Foo Bar" "yes"
-        ydescribe "labels2" $ do
+        ydescribe "byLabel-related tests" $ do
             yit "fails with \"More than one label contained\" error" $ do
                 get ("/labels2" :: Text)
                 (bad :: Either SomeException ()) <- try (request $ do
@@ -233,7 +234,48 @@
                     setUrl ("labels2" :: Text)
                     byLabelExact "hobby" "fishing")
                 assertEq "failure was called" (isRight bad) True
-
+            yit "byLabelContain looks for the labels which contain the given label name" $ do
+                get ("/label-contain" :: Text)
+                request $ do
+                    setMethod "POST"
+                    setUrl ("check-hobby" :: Text)
+                    byLabelContain "hobby" "fishing"
+                res <- maybe "Couldn't get response" simpleBody <$> getResponse
+                assertEq "hobby isn't set" res "fishing"
+            yit "byLabelContain throws an error if it finds multiple labels" $ do
+                (bad :: Either SomeException ()) <- try (request $ do
+                    setMethod "POST"
+                    setUrl ("label-contain-error" :: Text)
+                    byLabelContain "hobby" "fishing")
+                assertEq "failure wasn't called" (isLeft bad) True
+            yit "byLabelPrefix matches over the prefix of the labels" $ do
+                get ("/label-prefix" :: Text)
+                request $ do
+                    setMethod "POST"
+                    setUrl ("check-hobby" :: Text)
+                    byLabelPrefix "hobby" "fishing"
+                res <- maybe "Couldn't get response" simpleBody <$> getResponse
+                assertEq "hobby isn't set" res "fishing"
+            yit "byLabelPrefix throws an error if it finds multiple labels" $ do
+                (bad :: Either SomeException ()) <- try (request $ do
+                    setMethod "POST"
+                    setUrl ("label-prefix-error" :: Text)
+                    byLabelPrefix "hobby" "fishing")
+                assertEq "failure wasn't called" (isLeft bad) True
+            yit "byLabelSuffix matches over the suffix of the labels" $ do
+                get ("/label-suffix" :: Text)
+                request $ do
+                    setMethod "POST"
+                    setUrl ("check-hobby" :: Text)
+                    byLabelSuffix "hobby" "fishing"
+                res <- maybe "Couldn't get response" simpleBody <$> getResponse
+                assertEq "hobby isn't set" res "fishing"
+            yit "byLabelSuffix throws an error if it finds multiple labels" $ do
+                (bad :: Either SomeException ()) <- try (request $ do
+                    setMethod "POST"
+                    setUrl ("label-suffix-error" :: Text)
+                    byLabelSuffix "hobby" "fishing")
+                assertEq "failure wasn't called" (isLeft bad) True
         ydescribe "Content-Type handling" $ do
             yit "can set a content-type" $ do
                 request $ do
@@ -383,6 +425,21 @@
         return ("<html><label><input type='checkbox' name='fooname' id='foobar'>Foo Bar</label></html>" :: Text)
     onStatic "labels2" $ dispatchTo $
         return ("<html><label for='hobby'>hobby</label><label for='hobby2'>hobby2</label><input type='text' name='hobby' id='hobby'><input type='text' name='hobby2' id='hobby2'></html>" :: Text)
+    onStatic "label-contain" $ dispatchTo $
+        return ("<html><label for='hobby'>XXXhobbyXXX</label><input type='text' name='hobby' id='hobby'></html>" :: Text)
+    onStatic "label-contain-error" $ dispatchTo $
+        return ("<html><label for='hobby'>XXXhobbyXXX</label><label for='hobby2'>XXXhobby2XXX</label><input type='text' name='hobby' id='hobby'><input type='text' name='hobby2' id='hobby2'></html>" :: Text)
+    onStatic "label-prefix" $ dispatchTo $
+        return ("<html><label for='hobby'>hobbyXXX</label><input type='text' name='hobby' id='hobby'></html>" :: Text)
+    onStatic "label-prefix-error" $ dispatchTo $
+        return ("<html><label for='hobby'>hobbyXXX</label><label for='hobby2'>hobby2XXX</label><input type='text' name='hobby' id='hobby'><input type='text' name='hobby2' id='hobby2'></html>" :: Text)
+    onStatic "label-suffix" $ dispatchTo $
+        return ("<html><label for='hobby'>XXXhobby</label><input type='text' name='hobby' id='hobby'></html>" :: Text)
+    onStatic "label-suffix-error" $ dispatchTo $
+        return ("<html><label for='hobby'>XXXhobby</label><label for='hobby2'>XXXneo-hobby</label><input type='text' name='hobby' id='hobby'><input type='text' name='hobby2' id='hobby2'></html>" :: Text)
+    onStatic "check-hobby" $ dispatchTo $ do
+        hobby <- lookupPostParam "hobby"
+        return $ fromMaybe "No hobby" hobby
 
     onStatic "checkContentType" $ dispatchTo $ do
         headers <- requestHeaders <$> waiRequest
diff --git a/yesod-test.cabal b/yesod-test.cabal
--- a/yesod-test.cabal
+++ b/yesod-test.cabal
@@ -1,5 +1,5 @@
 name:               yesod-test
-version:            1.6.1
+version:            1.6.2
 license:            MIT
 license-file:       LICENSE
 author:             Nubis <nubis@woobiz.com.ar>
@@ -62,6 +62,7 @@
                           , yesod-form >= 1.6
                           , text
                           , wai
+                          , wai-extra
                           , http-types
                           , unliftio
 
