Использование Selenium с Chrome версии 74: возникает неожиданное исключение NoSuchElementException - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь использовать Selenium с версией 74 Chrome.Я загрузил самые последние обновления от Selenium и ChromeDriver, как указано в документации.Это был мой функциональный код до обновлений -

IWebDriver driver = new ChromeDriver();

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(8));
{
    driver.Url = "https://iam.mySite.com";
};

, но после обновления я начал получать ошибку

OpenQA.Selenium.DriverServiceNotFoundException: 'The chromedriver.exe file 
does not exist in the current directory or in a directory on the PATH 
environment variable. The driver can be downloaded at http://chromedriver.storage.googleapis.com/index.html

Из-за этой ошибки я изменил свой код на

IWebDriver driver = new ChromeDriver(@"C:\Users\UserName\.nuget\packages\selenium.webdriver.chromedriver\74.0.3729.6\driver\win32");
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(8));
{
    driver.Url = "https://iam.mySite.com";
};

Но теперь я получаю эту ошибку -

OpenQA.Selenium.NoSuchElementException: 'no such element: Unable to locate element: 
{"method":"xpath","selector":"//*[@id='username']"}
  (Session info: chrome=74.0.3729.131)
  (Driver info: chromedriver=74.0.3729.6)

Я дважды проверил имя пользователя xpath, и оно не изменилось.Есть ли простой способ понизить версию Chrome?Я помещаю драйвер в неправильную папку?

1 Ответ

0 голосов
/ 09 мая 2019

@ karkMump, как только вы убедились, что селен запускается нормально и конфигурация верна - попробуйте различные механизмы ожидания , например:

  • явные ожидания
  • неявные ожидания
  • свободное ожидание (в привязках Java)

и примените его к веб-сайту на странице.

Некоторые примеры кода ожидания некоторых конкретных элементов с помощью C #:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(1));
IWebElement element = wait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(By.TagName("textarea")));

В качестве альтернативы, если вам нужен больший контроль над конкретными настройками ожидания, вы можете сделать это:

DefaultWait<IWebDriver> wait = new DefaultWait(driver);
wait.Timeout = TimeSpan.FromSeconds(1);
wait.PollingInterval = TimeSpan.FromMilliseconds(100);
wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
IWebElement element = wait.Until<IWebElement>((d) =>
{
    return d.FindElement(By.TagName("textarea"));
});

Если вы действительно, действительно хотите поместить это в формат, в котором вы можете передать любой локатор, какой захотите, оберните его другим способом, например так:

public IWebElement WaitForElementVisible(By locator, TimeSpan timeout)
{
    WebDriverWait wait = new WebDriverWait(driver, timeout);
    IWebElement element = wait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(locator));
}

Примечание по C #, касающееся ожидания по умолчанию в c #: Ожидание по умолчанию - это более общее ожидание в том смысле, что оно не связано с WebDriver. Это ожидание может использоваться для передачи любого объекта ожидания. Вот пример кода (ожидающего изменения цвета определенного элемента на странице):

static void Main(string[] args)
        {
            IWebDriver driver = new FirefoxDriver();
            driver.Navigate().GoToUrl("https://experitest.com/selenium-testing");
            IWebElement element = driver.FindElement(By.Id("colorVar"));
            DefaultWait<IWebElement> wait = new DefaultWait<IWebElement>(element);
            wait.Timeout = TimeSpan.FromMinutes(2);
            wait.PollingInterval = TimeSpan.FromMilliseconds(250);

            Func<IWebElement, bool> waiter = new Func<IWebElement, bool>((IWebElement ele) =>
                {
                    String styleAttrib = element.GetAttribute("style");
                    if (styleAttrib.Contains("red"))
                    {
                        return true;
                    }
                    Console.WriteLine("Color is still " + styleAttrib);
                     return false;
                });
            wait.Until(waiter);
        }

Вы можете видеть, что здесь DefaultWait не привязано к WebDriver . Вы можете ждать что угодно

Надеюсь, это поможет. С Уважением, Евгений

...