我正在尝试使用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>
详细的错误描述:
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'
从调试中提交按钮详细信息:
希望此附加信息有助于找到原因-预先感谢!
答案 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;
};
}
[问题编辑后的添加内容] 该错误表明您有一个元素,而硒此时无法单击。 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