Selenium VBA Excel - проблема с щелчком по ссылке внутри фрейма - PullRequest
2 голосов
/ 29 марта 2020

Я новичок в форуме и имею некоторый опыт работы с VBA, но не очень.

Я использую Selenium для облегчения взаимодействия с сайтом Chrome с целью автоматизации серии запросов к сайт (веб-встречи Starleaf) с данными в электронной таблице Excel.

Я могу войти в систему и могу переходить от страницы к странице, используя операторы FindElementByID и FindElementByTag("a").Click.

У меня есть проблема с навигацией при использовании этого подхода на одной странице. Я пробовал ByID(the first 2 IDs in the code below), ByLinkText, ByClass (portalContent, button, single), ByCssSelector; но ничего не работает. Макрос останавливается в строке кода этой формы:

Set elem = bot.FindElementBy*****("Parameter")
    elem.FindElementByTag("a").Click

Код на странице, о которой идет речь:

<div class="portalContent">
    <div id="viewConferencesAddDiv" class="buttons single" style="">
        <a id="viewConferences_add" href="https://portal.starleaf.com/#page=addUserConference" target="_parent">
            <span id="viewConferences_add_text">Schedule meeting</span>
        </a>
    </div>    

Интересно, есть ли id="viewConferences_add" между тегом 'a'? и проблема может быть в href, но я не уверен, как обойти это.

Альтернативный подход, который я попытался использовать, - это go непосредственно на страницу, которая мне нужна после входа в систему, однако это не похоже на работу. У меня может быть проблема с синтаксисом ???

Вот что я попробовал:

 bot.Get "/#page=addUserConference"
 bot.Get "https://portal.starleaf.com/#page=addUserConference"
 bot.Get "//portal.starleaf.com/#page=addUserConference"

С помощью этого кода впоследствии, чтобы дать время для загрузки страницы:

 Do Until InStr(1, bot.Url, "addUserConference") > 0
 Application.Wait (DateAdd("s", 1, Now))
 DoEvents
 Loop

Обновление

Я осмотрелся и обнаружил, что кто-то говорит о переключении iframe. Глядя на страницу в F12, она выглядит так, как будто кнопка «Назначить встречу» может быть в фрейме. Предложение было переключиться на, если, однако, я не знаю, как это сделать. Похоже, что на странице несколько фреймов - так что, думаю, мне нужен идентификатор. Я думаю, что это может быть id = mainPanel_iframe.

HTML тега iframe:

<iframe id="mainPanel_iframe" name="mainPanel_iframe" class="mochaIframe" src="https://portal.starleaf.com/pbx/node-1.live.pr.starleaf.com/portal/#page=users&amp;lang=en_int" marginwidth="0" marginheight="0" frameborder="0" scrolling="auto" style="height: 579px; width: 1543px;"></iframe>

1 Ответ

2 голосов
/ 29 марта 2020

Чтобы перейти по ссылке с текстом Расписание собрания , вам нужно вызвать Ожидание , и вы можете использовать любой из следующих Стратегий локатора :

  • Использование FindElementByCss:

    bot.wait 5000
    bot.FindElementByCss("a#viewConferences_add[href*='addUserConference'] > span#viewConferences_add_text").Click
    
  • Использование FindElementByXPath:

    bot.wait 5000
    bot.FindElementByXPath("//a[@id='viewConferences_add' and contains(@href, 'addUserConference')]/span[@id='viewConferences_add_text']").Click
    

Обновление

Если нужный элемент находится в пределах <iframe>, сначала вам нужно SwitchToFrame следующим образом:

  • Использование FindElementByCss:

    bot.wait 5000
    bot.SwitchToFrame "mainPanel_iframe"
    bot.wait 5000
    bot.FindElementByCss("a#viewConferences_add[href*='addUserConference'] > span#viewConferences_add_text").Click
    
  • Использование FindElementByXPath:

    bot.wait 5000
    bot.SwitchToFrame "mainPanel_iframe"
    bot.wait 5000
    bot.FindElementByXPath("//a[@id='viewConferences_add' and contains(@href, 'addUserConference')]/span[@id='viewConferences_add_text']").Click
    

Найти подробное обсуждение можно в разделе Как отправить текст в поле имени пользователя внутри iframe с помощью Selenium VBA


Reference

Способы работы с #document в iframe

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