Селен Findelement VBA блокирует рутину - PullRequest
0 голосов
/ 12 сентября 2018

это мой код для открытия сайта и поиска объектов.Может случиться, что объект не найден, и поэтому я должен настроить поиск по его существованию или нет, чтобы выполнять или не выполнять операции.Я пытаюсь таким образом, но если объект, который я ищу, рутина рушится ....

  Dim bot As New SeleniumWrapper.WebDriver
  bot.SetProfile "C:\Users\USER\AppData\Local\Google\Chrome\User Data\Default"
  bot.start "chrome", "https://website.com/"
  bot.Open "/"
  bot.wait 10000
  bot.findElementByClassName("_20NlL").Click
  bot.Wait 1000
  bot.findElementByClassName("C28xL").Click
  bot.Wait 1200
  bot.SendKeys text
  bot.Wait 2000
  Dim notext As WebElement
  Set notext = bot.findElementByClassName("_3WZoe", timeoutms:=0)
  If notext Is Nothing Then
  ......[this is the error that is shown to me][1]

! [1]: https://i.stack.imgur.com/wWKzW.jpg

в чем я не прав?

если я объявил бота в качестве веб-драйвера или chromedriver, как указано QHarr, я получаю эту ошибку, к сожалению ....

ошибка времени выполнения 33: сеанс не создан, исключение ecc.я использую хром 69.0

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Ряд ошибок, которые я вижу, заставляет меня думать, что вы перевели это на другой язык или работаете с синтаксисом, не рассчитанным на текущую базовую оболочку селена .

1) Для селена основной следующий timeoutms не является именованным аргументом. Правильный именованный аргумент - timeout, поэтому что-то не так с сообщенной вами ошибкой, поскольку вы должны были получить сообщение об ошибке именованного аргумента.

2) При использовании Chrome просто объявите Dim bot As New WebDriver или New ChromeDriver.

3) Правильный метод с основным селеном: FindElementByClass


Ваш sendKeys скорее всего должен быть сфокусирован на конкретном элементе, например

bot.findElementByClass("C28xL").SendKeys Text

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

bot.findElementByClass("_3WZoe", timeout:=0, Raise:=False)

Опять-таки, учитывая точку вокруг перемещения родительских тегов form/frame/iframe и времени ожидания.


Убедитесь, что вы используете последнюю версию браузера Chrome и ChromeDriver . ChromeDriver должен находиться по окружающему пути , т. Е. В папке, находящейся по окружающему пути, и этот раздел пути (для драйвера) должен содержать, но не включать .exe (то есть до содержащий уровень папки). В качестве альтернативы вы можете указать местоположение для поиска драйвера в виде инструкции в коде.

0 голосов
/ 12 сентября 2018
Set notext = bot.findElementByClassName("_3WZoe", timeoutms:=0)

Вы явно настройка timeoutms:=0. Вы не даете времени попытаться найти элемент на странице. Уберите этот параметр из вашего звонка, дайте ему время найти элемент на странице. Он будет работать со значением тайм-аута по умолчанию (не припомните, что это не так), но в большинстве случаев должен возвращаться быстро. Вы уже ждали 2 секунды от вашей предыдущей команды sendKeys, поэтому вероятно (хотя и не гарантировано), что элемент будет загружен к тому времени.


Кроме того, вполне возможно, что искомый элемент находится в рамке где-то на странице, и вам придется переключиться на нужный кадр, прежде чем у вас когда-нибудь появится возможность работать findElementBy<anyoftheoptions>.

Это была одна из самых больших проблем, с которой я столкнулся, это просто отсутствие достаточного понимания HTML, чтобы быстро и легко пролистать источник веб-страницы, чтобы «облегчить работу» проекта. Я сделал, с достаточным количеством проб и ошибок, в конце концов добился этого.


Кроме того, я настоятельно рекомендую вам обернуть все это в некоторую обработку ошибок, чтобы иметь возможность отлавливать и корректно восстанавливаться после ошибок. Вы имеете дело с веб-серверами, интернетом и общим трафиком за пределами вашей локальной сети - будет таймаутов. Было бы хорошо, если бы ваш код не взорвался из-за того, что находится вне вашего контроля.

...