OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError в WebElement Отправить нажмите - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь автоматизировать сценарий для некоторых веб-страниц, используя C #, Selenium и Chrome Webdriver, где при нажатии кнопки «Отправить» на странице будут отправлены значения sendkeys.
Однако при нажатии кнопки «Отправить» выдается * 1002.* ошибка в окне обозревателя тестов Visual Studio (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

Я пробовал приведенные ниже варианты кода, но все онине удается выполнить submitBtnReview.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) и использование chrome версии 70.0.3538.102 (Официальная сборка) (64-разрядная версия) на компьютере с Windows 10.

Любая идеячто я могу здесь делать не так?


[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 голосов
/ 27 ноября 2018

Элемент выглядит как динамический элемент, поэтому вам нужно заставить 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

0 голосов
/ 27 ноября 2018

Точного ответа пока нет, только некоторые наблюдения.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 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...