WebElement上的OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError提交单击

时间:2018-11-27 03:29:52

标签: c# selenium selenium-webdriver xpath css-selectors

我正在尝试使用C#,Selenium和Chrome Webdriver自动执行某些网页的场景,其中单击页面上的Submit按钮将提交sendkeys值。
但是,单击“提交”时,它将在Visual Studio测试浏览器窗口(UnpackAndThrowOnError)中引发Nunit错误。

    <button type="submit" class="btn btn-primary mr-4" name="postType" value="Submit">Submit<span class="glyphicon glyphicon-floppy-save"></span></button>

enter image description here

详细的错误描述:

at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(ResponseerrorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary'2 parameters)
at OpenQA.Selenium.Remote.RemoteWebElement.Execute(String commandToExecute, Dictionary'2 parameters)<br>
at OpenQA.Selenium.Remote.RemoteWebElement.Click()
at Onrsr.Specflow.Sampletest.occurrence() in C:\Users\manish.sharma\source\repos\Onrsr.Specflow\Onrsr.Specflow\Sampletest.cs:line 180

我尝试了以下代码选项,但它们均未通过commitBtnReview.Click()

IWebElement submitBtnReview = driver.FindElement(By.XPath("//button[contains(.,'Submit')]"));
submitBtnReview.Click();

IWebElement submitBtnReview = driver.FindElement(By.CssSelector("input[value='Submit']"));
submitBtnReview.Click();

IWebElement submitBtnReview = driver.FindElement(By.XPath("//button[@class='btn btn-primary mr-4']"));
submitBtnReview.Click();

IWebElement submitBtnReview = driver.FindElement(By.CssSelector("input[type='submit'][value='Submit']"));
submitBtnReview.Click();

我也尝试将submitBtnReview.Submit()与上面的IwebElement一起使用,但是它使页面崩溃。

我正在使用最新版本的Selenium.WebDriver(3.141.0)和Selenium.Chrome.WebDriver(2.43.0),并在Windows 10计算机上使用Chrome版本70.0.3538.102(正式版本)(64位)

你知道我在这里做错什么吗?


[05/12/2018] -感谢您提供宝贵的反馈-我现在也尝试了以下操作,但它们在submitBtnReview.Click()上失败,并出现新错误:

Message: OpenQA.Selenium.WebDriverException : unknown error: Element <button type="submit" class="btn btn-primary mr-4" name="postType" value="Submit">...</button> is not clickable at point (1792, 876). Other element would receive the click: <footer class="border-top bg-white">...</footer> (Session info: chrome=70.0.3538.110) (Driver info: chromedriver=2.43.600210 (68dcf5eebde37173d4027fa8635e332711d2874a),platform=Windows NT 10.0.17134 x86_64)

IWebElement submitBtnReview = driver.FindElement(By.CssSelector("button[type='submit'][value='Submit'][name='postType']"));
IWebElement submitBtnReview = driver.FindElement(By.XPath("//button[contains(@class, 'btn') and contains(@class, 'btn-primary') and contains(@class, 'mr-4')]"));
IWebElement submitBtnReview = driver.FindElement(By.XPath("//button[@class='btn btn-primary mr-4']"));
IWebElement submitBtnReview =  new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//button[@class='btn btn-primary mr-4' and @name='postType'][normalize-space()='Submit']")));
IWebElement submitBtnReview = new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(element_is_present(By.CssSelector("button[type='submit'][value='Submit'][name='postType']")))


public static Func<IWebDriver, IWebElement> element_is_present(By by)
    { return driver =>
        { IWebElement element = driver.FindElement(by);
            try
            { if (element != null && element.Displayed && element.Enabled)
                { return element;
                }
                else
                { return null;
                }
            }catch (StaleElementReferenceException)
            { return null;
            }
        };
    }

设置一些断点,显示submitBtnReview LocationOnScreen坐标并出现新错误,这可能是相关的。

    LocationOnScreen = '((OpenQA.Selenium.Remote.RemoteCoordinates)((OpenQA.Selenium.Remote.RemoteWebElement)submitBtnReview ).Coordinates).LocationOnScreen' threw an exception of type 'System.NotImplementedException'

从调试中提交按钮详细信息:

enter image description here

错误图片: enter image description here

希望此附加信息有助于找到原因-预先感谢!

2 个答案:

答案 0 :(得分:1)

到目前为止,还没有确切答案,只是一些观察。给定的定位器中有3个看起来不正确,尽管1个看起来还可以。

1)By.XPath(“ // button [contains(。,'Submit')]”))); --->看起来很正确--- explained here

建议:如果文本值被给定元素class的任何值修改,并且按钮在屏幕上显示为(全部大写)或“提交”(全部小写)您也应该在xpath中使用它作为“ //button[contains(.,'SUBMIT')]”“或” //button[contains(.,'submit')]“”。

2)By.CssSelector(“ input [value ='Submit']”))); ---> By.CssSelector(“ 按钮 [value ='Submit']”))) ---您的标签是<button>而不是{{1 }}

3)By.XPath(“ // button [@ class ='btn btn-primary mr-4']”); ---> By.XPath(“ // button [包含(@class,'btn'))和contains(@class,'btn-primary')和contains(@class,'mr-4 ')]) --- explained here

4)By.CssSelector(“ input [type ='submit'] [value ='Submit']”))); ---> By.CssSelector(“ 按钮 [type ='submit'] [value ='Submit']”))); ---您的标签是<input>而不是<button> explained here

点击之前,请确保该元素是可点击的

<input>

可用于类似:

public static Func<IWebDriver, IWebElement> ElementIsClickable(By locator)
{
    return driver =>
    {
        var element = driver.FindElement(locator);
        return (element != null && element.Displayed && element.Enabled) ? element : null;
    };
}

original source

[问题编辑后的添加内容] 该错误表明您有一个元素,而硒此时无法单击。 the problem is described and solved here

我认为,最稳定但最骇人听闻的方法是尝试 javascript单击(如果屏幕上有元素,只需必须单击) ,并根据您确实拥有的示例)

var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
var clickableElement = wait.Until(ExpectedConditions.ElementIsClickable(By.Id("id"))

另一种情况 是确保您的元素位于浏览器的可见区域(您可以在调试过程中查看/单击它)无需任何手动滚动)。如果看不见或看不到它-请先滚动到它,再点击

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);

仔细检查建议: ,请确保该定位器中确实存在一个元素。通常的情况是,您认为找到了“正确的”元素,而硒却找到了第一个匹配项,而不是您想要的那个。

另一个建议 :您的元素在找到后可能会改变其位置。因此您找到了它,将其保存到变量中,然后由于某种原因页面布局发生了变化(例如,异步加载已完成)。您可以仔细注意页面的加载方式。布局会改变吗?如果是,则可以创建一个自定义的等待函数,该函数将检查元素坐标在1-2秒内是否保持不变。

答案 1 :(得分:0)

该元素看起来是一个动态元素,因此您需要诱使 WebDriverWait 使元素可点击,并且您可以使用以下任一解决方案:

  • CssSelector

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("button.btn.btn-primary.mr-4[name='postType'][value='Submit']"))).Click();
    
  • XPath

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//button[@class='btn btn-primary mr-4' and @name='postType'][normalize-space()='Submit']"))).Click();
    
  • 注意:在使用 ChromeDriver v2.43 时,请确保您正在使用 Chrome v69-71