#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();")