Точного ответа пока нет, только некоторые наблюдения.3 из указанных локаторов выглядят некорректно, хотя 1 выглядит нормально.
1) By.XPath ("// button [содержит (., 'Отправить')]"));---> Выглядит правильно --- объяснено здесь
Предложение: если текстовое значение изменяется любым из значений данного элемента class
и кнопка отображается на экране как 'SUBMIT' (все заглавные буквы) или передать (все строчные буквы), вы должны также использовать его в xpath, чтобы быть "//button[contains(.,'SUBMIT ')]" или "// button [содержит (., 'submit')] ".
2) By.CssSelector (" input [value = 'Submit'] "));---> By.CssSelector (" button [value = 'Submit']")); --- ваш тег <button>
не <input>
3) By.XPath ("// button [@ class = 'btn btn-primary mr-4']");---> By.XPath ("кнопка // [ содержит (@class, 'btn')) и содержит (@class, 'btn-primary') и содержит (@class, 'mr-4') ]) --- объяснено здесь
4) By.CssSelector ("input [type =' submit '] [value =' Submit ']")); ---> By.CssSelector (кнопка " [type = 'submit'] [value = 'Submit']")); --- ваш тег <button>
, а не <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;
};
}
Используется в чем-то вроде:
var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
var clickableElement = wait.Until(ExpectedConditions.ElementIsClickable(By.Id("id"))
оригиналисточник
[Дополнение после вопроса в отредактированном виде] В сообщении об ошибке указано, что у вас есть элемент и что селен не может щелкнуть по нему в точке. проблема описана и решена здесь
На мой взгляд, самый стабильный, но самый хакерский способ - попробовать javascript click (это просто должны щелкнуть, если у вас есть элемент на экране, и на основе примеров, которые у вас есть it):
IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Другой случай - убедиться, что ваш элемент находится в видимой области браузера (вы можетеувидеть / щелкнуть по нему во время отладки без какой-либо ручной прокрутки).Если он не виден или не полностью виден - прокрутите до него , прежде чем нажимать .
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView()", Webelement);
Предложение о двойной проверке: убедитесь, что есть только один элемент с таким локатором.Обычный случай, когда вы думаете, что нашли «правильный» элемент, но селен находит первое совпадение, а это не тот, который вам нужен.
Другое предложение означает, что ваш элемент может изменить его положение после того, как вы его нашли .Итак, вы нашли его, сохранили в переменную, а затем по какой-то причине изменился макет страницы (например, что-то асинхронное завершение загрузки).Вы можете внимательно следить за тем, как загружается ваша страница.Меняется ли макет?Если да - вы можете создать пользовательскую функцию ожидания, которая будет проверять, что координаты элемента не меняются, скажем, в течение 1-2 секунд.