vba: как нажать на элемент в iframe - PullRequest
0 голосов
/ 06 января 2019

Моя цель - щелкнуть элемент в HTML-кадре Iframe, но пока у меня ничего не получалось. Надеюсь, кто-нибудь посоветует, как правильно подойти к этой задаче, поскольку я бегаю кругами уже несколько недель.

Я пытался щелкнуть по идентификатору div, названию span, но пока ничего не получалось Я считаю, что это потому, что неправильный синтаксис

Option Explicit

Sub it_will_work()
'make the app work faster?
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'--------------------------------
Dim sht As Worksheet
Set sht = ThisWorkbook.Sheets("Fields") 'my data will be stored here

Dim LastRow As Long
LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row 'range definition

Dim i As Long            'Will be used for a loop that navigate to different url
For i = 2 To LastRow     'First url starts at row 2 untill the last row

Dim IE As Object         'Internet Explorer declaration
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True

IE.navigate sht.Range("A" & i).Value 'My url that I want to navigate to
While IE.readyState <> 4 Or IE.Busy: DoEvents: Wend

Dim Doc As New HTMLDocument 'Will be used for the main html page
Set Doc = IE.document

Doc.getElementById("tab7").Click  'data taht need to be updated is here

'Global workgroup data that will effect the workgroup data(dependency)
Doc.getElementById("mcdResourceGlobalWorkgroup_ddltxt").Value = sht.Range("W" & i).Value
Doc.getElementById("mcdResourceGlobalWorkgroup_ddltxt").Focus
Doc.getElementById("mcdResourceGlobalWorkgroup_ddlimg").Click

'Workgroup dropdown, that need to be choosen within the Iframe:
Doc.getElementById("ResourceWorkgroup").Value = sht.Range("X" & i).Value '1) worgroup that I want to insert
Doc.getElementById("ResourceWorkgroup").Focus
Doc.getElementById("_IB_imgResourceWorkgroup").Click  '2) Cliking here will generate dropdown values according the value inserted above

Application.Wait Now + TimeValue("00:00:5") 'before refering to Iframe I let the values to be loaded

'***from this point I have the issue where I try to access Iframe and click on the desired element:***
'Here I declare Iframe
Dim objIFRAME As Object
Set objIFRAME = IE.document.getElementsByTagName("iframe")
Debug.Print TypeName(objIFRAME)

'Here I ask to click on a title within the Iframe where value = X
objIFRAME.getElementsByName("title").Value = sht.Range("X" & i).Value.Click

Next i

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

После загрузки URL должны быть выполнены следующие шаги:

  1. Нажмите на вкладку 7 -> откроется правильная вкладка для работы на
  2. Ввод значения из столбца "W" в поле "Глобальная рабочая группа"
  3. сосредоточиться на поле "Глобальная рабочая группа"
  4. Нажмите на изображение, которое подтверждает поле «Глобальная рабочая группа» (проверяет введенное значение)
  5. Ввод значения из столбца "X" в поле "Рабочая группа"
  6. сосредоточиться на поле «Рабочая группа»
  7. Нажмите на изображение, которое открывает раскрывающиеся опции, которые генерируются в соответствии с введенным значением в поле «Рабочая группа»
  8. В Iframe, нажмите на заголовок, который равен значению который был вставлен в поле «Рабочая группа»

Я также пытался использовать Selenium IDE, чтобы видеть, как записанный макрос обращается к Iframe и щелкает по нужному элементу:

  1. Команда: Выбрать кадр | Цель: индекс = 2
  2. Нажмите | Цель: css = span [title = "APAC"]

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

Ниже изображения html-код Iframe и желаемый элемент, на который я хочу нажать: HTML code image

1 Ответ

0 голосов
/ 06 января 2019

Вы должны быть в состоянии использовать следующий синтаксис

ie.document.querySelector("[id='_CPDDWRCC_ifr']").contentDocument.querySelector("span[title=APAC]").click

С селеном вы можете использовать

driver.SwitchToFrame driver.FindElementByCss("[id='_CPDDWRCC_ifr']")
driver.FindElementByCss("span[title=APAC]").click

С вашим существующим решением для тегов вам нужно использовать индекс. Например,

objIFRAME(0) 

Тогда querySelector на contentDocument этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...