Как найти элемент в кадре в IE? - PullRequest
0 голосов
/ 05 июня 2018

Испытания кода:

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@src,'path')]")));
driver.findElement(By.id());

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

То же самое работает в Chrome иFire Fox.Но то же самое не работает в IE (пробовал в IE9 и IE11).Используемый WebDriver: IEDriverServer Ver: 3.12.0.0

Это из-за режима документа?или из-за какой-либо проблемы с отображением страницы?В каком случае это произойдет?

HTML Ссылка на исходный код: Исходный код

Попытка найти идентификатор MF:txtentdon

НадеюсьНе знаю, важно это или нет, но также выдает HTTP Status: '404' -> incorrect JSON status mapping for 'stale element reference' (400 expected)

Ошибка трассировки стека:

org.openqa.selenium.NoSuchElementException: Unable to find element with css selector == #MF\:txtentdon
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'N9776', ip: '172.29.18.139', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_131'
Driver info: org.openqa.selenium.ie.InternetExplorerDriver
Capabilities [{proxy=Proxy(), acceptInsecureCerts=false, browserVersion=9, se:ieOptions={nativeEvents=true, browserAttachTimeout=0.0, ie.ensureCleanSession=false, elementScrollBehavior=0.0, enablePersistentHover=true, ie.browserCommandLineSwitches=, ie.forceCreateProcessApi=false, requireWindowFocus=false, initialBrowserUrl=http://localhost:6017/, ignoreZoomSetting=false, ie.fileUploadDialogTimeout=3000.0, ignoreProtectedModeSettings=false}, timeouts={implicit=0.0, pageLoad=300000.0, script=30000.0}, browserName=internet explorer, pageLoadStrategy=normal, javascriptEnabled=true, platformName=windows, setWindowRect=true, platform=ANY}]
Session ID: 48da0488-5d2e-46db-996e-77f27f26ff28
*** Element info: {Using=id, value=MF:txtentdon}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:150)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:115)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:45)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:410)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:453)
    at org.openqa.selenium.By$ById.findElement(By.java:218)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:402)

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Это сообщение об ошибке ...

org.openqa.selenium.NoSuchElementException: Unable to find element with css selector == #MF\:txtentdon

... означает, что серверу InternetExplorerDriver не удалось найти нужный элемент.

Похоже, ваша основная проблемабыть несовместимостью между версией двоичных файлов , которые вы используете следующим образом:

  • Вы используете Selenium Java Client v3.4.0
  • Вы используете IEDriverServer v3.12.0.0
  • Вы используете JDK v1.8.0_131

Таким образом, существует явное несоответствие между JDK v1.8.0-131 , Selenium Client v3.4.0 и IEDriverServer v3.12.0.0 .

Решение

При работе с Selenium Java Client , InternetExplorerDriver и Internet Explorer убедитесь, что:

  • Вы выполнили Требуемую конфигурацию , а также дополнительные замечания для Собственные события и Фокус браузера согласно документации InternetExplorerDriver .
  • Вы обновили JDK допоследние уровни JDK 8u171 .
  • Вы обновили Selenium до текущих уровней Версия 3.12.0 .
  • Вы обновили InternetExplorerDriver до текущей IEDriverServer v3.12.0 level.
  • Clean ваше Project Workspace через IDE и Перестройте ваш проект только с необходимыми зависимостями.
  • Используйте CCleaner инструмент для удаления всех рутинных операций ОС до и после выполнения test Suite .
  • Возьмите перезагрузку системы .
  • Выполните @Test.
  • Всегда вызывайте driver.quit() в методе tearDown(){}, чтобы закрыть и уничтожить экземпляры WebDriver и Web Client изящно.

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

  • Всегда вызывать WebDriverwait при переключении на нужный frame .
  • Как только вы переключаетесь на желаемый frame побуждает WebDriverwait , пока вы ищите нужный элемент.
  • Поскольку ваш нужный элемент имеет атрибут readOnly = "readonly" , поэтому вам нужно использовать ExpectedConditions как visibilityOfElementLocated() следующим образом:
  • Итак, ваш эффективный кодблок будет:

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[contains(@src,'path')]")));
    WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@class='inputfld' and @id='MF:txtentdon']")));
    
0 голосов
/ 05 июня 2018

Вы можете попробовать с этим кодом:

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@src,'path')]")));  
System.err.println("inside frame");
WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.id("MF:txtentdon")));

Или

WebElement element =  new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.name("MF:txtentdon")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...