Selenium не может продолжить, поскольку chrome не загружает пользовательский интерфейс

#c# #selenium #google-chrome #selenium-chromedriver

#c# #selenium #google-chrome #selenium-chromedriver

Вопрос:

Иногда Selenium C # запускает Chrome, а также веб-сайт, но не может взаимодействовать с ним.

При ближайшем рассмотрении я заметил, что это было потому, что chrome не был в фокусе и не загружал пользовательский интерфейс.

Как только я сфокусировал chrome, я бы увидел белый экран на полсекунды, а затем появился пользовательский интерфейс. И как только появился пользовательский интерфейс, тест начал выполняться нормально.

Я чувствую, что chrome не может получить достаточно системных ресурсов без фона. Любая помощь была бы оценена. Я никогда не сталкивался с проблемой в selenium-python.

Веб-сайт — web.whatsapp.com

Комментарии:

1. что он должен делать? что он делает?

Ответ №1:

Похоже, вы не даете достаточно времени для загрузки страницы. Вы можете использовать любой из приведенных ниже методов ожидания.

Явное ожидание в Selenium C#

 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
String ele_xpath = "<xpath of element>"
WebDriverWait wait = new WebDriverWait(driver,30);
IWebElement welcomeMessage = 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.XPath(ele_xpath)));
// Here I have assumed first page is having a welcome message, you can use any element present on your page. Your script will wait up to 30 sec for element to appear before it will throw timeoutexception
  

неявное ожидание в Selenium C#

 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
//Above will make script to wait for each element up to 30 sec
  

ожидание в C#:

Вы можете попросить свой скрипт подождать определенную миллисекунду перед выполнением следующей строки кода:

 Thread.Sleep(6000);
# It will for 6 sec
  

Свободное ожидание в Selenium C#

 Wait<WebDriver> fluentWait = new FluentWait<WebDriver>(driver)
       .withTimeout(30, SECONDS) // this defines the total amount of time to wait for
       .pollingEvery(2, SECONDS) // this defines the polling frequency
       .ignoring(NoSuchElementException.class); // this defines the exception to ignore 
      WebElement welcomeMessage= fluentWait.until(new Function<WebDriver, WebElement>() {
     public WebElement apply(WebDriver driver)  //in this method defined your own subjected conditions for which we need to wait for
     {  return driver.findElement(By.xpath("//*[contains(text(),'Welcome')]"));
}});
  

Примечание: Вы можете использовать любой из приведенных выше методов ожидания. Однако у каждого из них есть свое преимущество / недостаток. Пожалуйста, прочитайте больше о них и различиях по ссылке ниже:
https://www.lambdatest.com/blog/selenium-waits-implicit-explicit-fluent-and-sleep /

Комментарии:

1. Извините, но, по крайней мере, вы должны были спросить в комментариях. Я уже использую явное ожидание.

2. Не извиняйся, приятель. Все в порядке, поскольку вы не упомянули в своем вопросе, я поместил здесь некоторую информацию. Также я не уверен, пробовали ли вы браузер без головы, если загрузка пользовательского интерфейса является проблемой. Приветствия 🙂

3. Отсутствие головы тоже является проблемой. Я не могу запустить безголовый chrome или chromium с месяца. Интересно, почему это не распространенная проблема. По крайней мере, chrome-dev должен сделать проблемы более открытыми и позволить нам открывать проблемы на github.

4. Я не могу не согласиться с вами. В любом случае я попробую с помощью скрипта python и дам вам знать, смогу ли я воспроизвести и решить проблему. Спасибо за выделение!!!!

Ответ №2:

Пожалуйста, попробуйте следующее — это принудительно сфокусирует Chrome (из предоставленной информации я могу предположить, что существует событие JS, которое блокирует загрузку страницы или запускает событие onfocus).

 var driver = new ChromeDriver();
driver.Manage().Window.Maximize(); // will focus or at least bring to front

// other things to try - switch
driver.SwitchTo().DefaultContent();
driver.SwitchTo().ActiveElement();

// other things to try - JavaScript
((IJavaScriptExecutor)driver).ExecuteScript("document.querySelector('body').focus();")