Selenium C # ElementNotVisibleException: элемент не взаимодействует, но элемент фактически виден - PullRequest
0 голосов
/ 02 декабря 2018

Я использую Selenium.WebDriver для C #, чтобы задать вопрос о Quora, просто набрав свой вопрос в блокноте.

Все работало нормально, так как мне пришлось его опубликовать.

Чтобы опубликовать егоМне нужно щелкнуть ссылку внутри промежутка, как это:

<span id="__w2_wEA6apRq1_submit_question">
  <a class="submit_button modal_action" href="#" id="__w2_wEA6apRq1_submit">Add Question</a>
</span>

Чтобы щелкнуть по ней, я попробовал этот метод, который я использовал для всех моих предыдущих нажатий кнопок:

Выбор элемента и щелчок по нему:

var element = driver.FindElement(By.CssSelector(".submit_button.modal_action"));
element.Click();

Таким образом я могу получить элемент, но, к сожалению, он выдает «ElementNotVisibleException».При отладке моего приложения я мог видеть, что свойство Displayed было установлено на False, хотя это не так, потому что в моем ChromeDriver я мог четко видеть кнопку.

Чтобы избежать нажатия на элемент, я попытался IJavaScriptExecutor и Driver.ExecuteJavaScript();, чтобы щелкнуть ссылку через скрипт:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].click()", element);

Та же логика была использована для Driver.ExecuteJavaScript();, но я получаю тот же результат, но когда я пишу тот же скрипт на вкладке консоли DevToolsон отлично работает.

Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

В соответствии с HTML, которым вы поделились, нажмите на элемент с текстом Добавить вопрос , так как элемент находится внутри Модальное диалоговое окно , вам нужно вызвать WebDriverWait для желаемого ElementToBeClickable , и вы можете использовать в качестве решения одну из следующих стратегий локатора :

  • LinkText:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.LinkText("Add Question"))).Click();
    
  • CssSelector:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("span[id$='_submit_question']>a.submit_button.modal_action"))).Click();
    
  • XPath:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//span[contains(@id,'_submit_question')]/a[@class='submit_button modal_action' and contains(.,'Add Question')]"))).Click();
    
0 голосов
/ 02 декабря 2018

В некоторых случаях кнопка может отображаться (отображаться) после выполнения проверки, поэтому вы можете попробовать выполнить следующую задержку, чтобы убедиться, что кнопка отображается во время проверки:

public static void WaitForElementToBecomeVisibleWithinTimeout(IWebDriver driver, 
    IWebElement element, int timeout)
{
    new WebDriverWait(driver,                 
        TimeSpan.FromSeconds(timeout)).Until(ElementIsVisible(element));
}

private static Func<IWebDriver, bool> ElementIsVisible(IWebElement element)
{
    return driver =>
    {
        try
        {
            return element.Displayed;
        }
        catch (Exception)
        {
            // If element is null, stale or if it cannot be located
            return false;
        }
    };
}

Если кнопка не видна в области просмотра (т.е. требуется прокрутка, чтобы стать видимой), вы можете прокрутить ее с помощью

public static void ScrollElementToBecomeVisible(IWebDriver driver, IWebElement element)
{
    IJavaScriptExecutor jsExec = (IJavaScriptExecutor)driver;
    jsExec.ExecuteScript("arguments[0].scrollIntoView(true);", element);
}
...