Get result from form website operation
I did that ugly try, because of NullReferenceException (if form is filled correctly, there would be no summary element, and if form is filled incorrectly, there would be no popup element).  


This problem can be easyly handled by a null check of the returned WebElement from the call to Driver.FindElement().  

A little bit more problematic is IMO the looping condition because the condition only could evaluate to true if the passed TimeSpan is negativ. If this is what you want you really should place a comment there. If you didn't mean to pass a negative timespan then you should reverse the looping condition to DateTime.Now &lt; deadline. 

Extracting the repeated call to TimeSpan.FromSeconds(5) to a variable will make the code easier to read.  

You know although copy &amp; pasta will save time, you need to check if the pasted code is correct (empty data vs tooMuchData)  


    // check if empty data
    try
    {
        var tooMuchData = new WebDriverWait(Driver, TimeSpan.FromSeconds(5))
    .Until(ExpectedConditions.TextToBePresentInElement(Driver.FindElement(By.Id("popup")), "Empty data"));
        if (tooMuchData) return false;  



Implementing the mentioned points will look like so  

public bool? GetResult(TimeSpan timeout)
{
    var deadline = DateTime.Now.Add(timeout);
    var waitTimeout = TimeSpan.FromSeconds(5);

    do
    {
        WebElement summaryWebElement = Driver.FindElement(By.Id("summary"));
        if (summaryWebElement != null)
        {
            var success = new WebDriverWait(Driver, waitTimeout).Until(ExpectedConditions.TextToBePresentInElement(summaryWebElement , "Success!"));
            if (success) return true;
        }

        WebElement popupWebElement = Driver.FindElement(By.Id("popup"));
        if (popupWebelement != null)
        {
            var notEnoughData = new WebDriverWait(Driver, waitTimeout).Until(ExpectedConditions.TextToBePresentInElement(popupWebElement, "Not enough data"));
            if (notEnoughData) return false;

            var tooMuchData = new WebDriverWait(Driver, waitTimeout).Until(ExpectedConditions.TextToBePresentInElement(popupWebelement, "Too much data"));
            if (tooMuchData) return false;

            var emptyData = new WebDriverWait(Driver, waitTimeout).Until(ExpectedConditions.TextToBePresentInElement(popupWebElement, "Empty data"));
            if (emptyData) return false;
        }

    } while (DateTime.Now &gt; deadline);

    return null;
}  


Because the checks for the popup text only differs from the expected text you could think about using a foreach loop over an array containing the expected strings.