Я пытаюсь реализовать увеличенный период ожидания для элементов. Однако похоже, что ни увеличенное время ожидания (60 секунд), ни значение по умолчанию (10) не распознаются. Загрузка сайта занимает где-то полторы секунды, но я сразу получаю ошибку, что первый искомый мной элемент не может быть найден.
cls
$workingPath = "D:\Dev\Selenium"
$env:PATH += ";$workingPath"
Add-Type -Path "$($workingPath)\lib\netstandard2.0\WebDriver.dll"
Add-Type -Path "$($workingPath)\lib\netstandard2.0\WebDriver.Support.dll"
$chromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions
$chromeOptions.AddArgument('start-maximized')
$chromeOptions.AddArgument('disable-gpu')
$chromeOptions.AddArgument('ignore-certificate-errors')
$chromeDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($workingPath, $chromeOptions)
[OpenQA.Selenium.Support.UI.WebDriverWait]$wait = New-Object OpenQA.Selenium.Support.UI.WebDriverWait ($chromeDriver, [System.TimeSpan]::FromSeconds(60))
$SiteUrl = "http://192.168.27.10"
$chromeDriver.Navigate().GoToURL($siteURL)
$username = $ChromeDriver.FindElement([OpenQA.Selenium.By]::Id('loginUsername-inputEl'))
$wait.Until([System.Func[OpenQA.Selenium.IWebDriver, OpenQA.Selenium.IWebElement]] { param($chromeDriver)Try { $username } Catch { $null } })
Насколько я знаю, вышеизложенное «должно» работать. Однако после загрузки сайта ожидание элемента не происходит, и выдается следующая ошибка:
Exception calling "FindElement" with "1" argument(s): "no such element: Unable to locate element: {"method":"css selector","selector":"#loginUsername\-inputEl"}
(Session info: chrome=123.0.6312.123); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception"
At line:18 char:1
+ $username = $ChromeDriver.FindElement([OpenQA.Selenium.By]::Id('login ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NoSuchElementException
Я могу подтвердить, что время ожидания действительно увеличивается до 60 секунд, запустив $wait:
$wait
Timeout PollingInterval Message
------- --------------- -------
00:01:00 00:00:00.5000000
Возможно, я делаю что-то неправильно; Я не уверен. Какие-либо предложения??
Ваш текущий код не имеет особого смысла. Вы ждете первого результата звонка FindElement()
вместо того, чтобы повторно звонить FindElement()
.
Я думаю, что вызов FindElement
должен находиться внутри блока скрипта, вызываемого $wait.Until()
:
$script:username = $null
# In this Func type, the first type relates to the parameter of the script block
# and the second type relates to its return value.
$null = $wait.Until( [Func[OpenQA.Selenium.IWebDriver, Boolean]] { param($chromeDriver)
try {
$script:username = $chromeDriver.FindElement([OpenQA.Selenium.By]::Id('loginUsername-inputEl'))
$true # As there was no exception, exit the wait loop
}
catch {
$false # Exception occurred, need to wait another time
}
})
# For debugging, output the value of the variable after the wait loop has finished
$script:username
Примечание:
$wait.Until()
, запускается в новой области и не может напрямую изменять переменные в родительской области (он может только читать их из-за динамической области действия PowerShell ). Есть и другие варианты, например использование ссылки или Set-Variable -Scope 1
, которые вы, возможно, захотите изучить.Эй, это отлично работает! Единственное изменение, которое мне пришлось внести, — это удалить OpenQA.Selenium.IWebElement из System.Func и вставить System.Boolean. Это произошло потому, что: Исключение, вызывающее «Until» с аргументами «1»: «Невозможно преобразовать значение «False» в тип «OpenQA.Selenium.IWebElement». Ошибка: «Недопустимое приведение из «System.Boolean» в «OpenQA. Selenium.IWebElement'."" В противном случае спасибо. Я думаю, что моя главная проблема заключалась в не совсем понимании правильного способа реализации тайм-аута. Теперь мне нужно расширить область действия остальных моих элементов.
Ооо, раздел комментариев никогда не форматируется должным образом, извините. Несмотря ни на что, еще раз спасибо
Делегат должен иметь доступ к этой переменной, определенной родительской областью, но он не сможет обновлять ее без модификатора области.
@SantiagoSquarzon Вы абсолютно правы, спасибо!
Какого черта это метод, чтобы каждый раз писать «True»? Я попробовал установить значение null, но это не сработало. Я полагаю, есть способ предотвратить это?
@sbagnato Попробуйте $null = $wait.Until(...
. Я считаю, что функция возвращает либо значение из блока скрипта, либо свой собственный статус. Любые неназначенные возвращаемые значения неявно выводятся PowerShell, что иногда может вызывать головную боль. При присвоении поддельной переменной $null
возвращаемое значение фактически отбрасывается.
Хороший звонок; это сделало это.
похоже, что вы ожидаете элемент после попытки найти элемент (должны перевернуть строки ожидания и имени пользователя)