Как перейти на iframe в соответствии с HTML, предоставляемым через Selenium и Java? - PullRequest
0 голосов
/ 05 сентября 2018

Таким образом я попытался переключиться на кадр:

driver.switchTo().frame(driver.findElement(By.xpath(("//iframe[contains(@name,'vfFrameId')]//following::iframe[2]"))));

В полном HTML-коде есть три iframe, и я пытаюсь перейти к третьему, и я могу найти это также с помощью xpath, но после запуска драйвер сценария не может найти это и выдает исключение .

Исключение:

no such element: Unable to locate element: {"method":"xpath","selector":"//iframe[contains(@name,'vfFrameId')]//following::iframe[2]"}

HTML:

<div class="windowViewMode-normal oneContent active forcePageHost" data-aura-rendered-by="1330:0" data-aura-class="forcePageHost">
    <div class="oneAlohaPage" data-aura-rendered-by="1335:0" data-aura-class="oneAlohaPage">
        <force-aloha-page data-data-rendering-service-uid="240" data-aura-rendered-by="1338:0" force-aloha-page_aloha-page="">
            <div class="slds-template_iframe slds-card" force-aloha-page_aloha-page="">
                <iframe height="100%" width="100%" scrolling="yes" allowtransparency="true" id="vfFrameId_1536141890078" name="vfFrameId_1536141890078" allowfullscreen="true" force-aloha-page_aloha-page="" allow="geolocation *; microphone *; camera *" title="Deploy Data Set"></iframe>
            </div>
        </force-aloha-page>
    </div>
</div>

enter image description here

Ответы [ 3 ]

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

Я работаю на ваш комментарий:

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

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

  1. Переключитесь на свой iframe. С этого момента ваш экземпляр driver указывает на этот iframe!
  2. Нажмите на элемент, который переходит на следующую страницу.
  3. Ваш driver экземпляр все еще указывает на iframe с шага 1! Вам нужно сбросить его в верхний документ, используя: driver.switchTo().defaultContent();.
  4. Только теперь вы можете переключиться на новый iframe на странице, на которую только что перешли.
0 голосов
/ 06 сентября 2018

В соответствии с текстовым HTML и HTML моментальным снимком, которым вы поделились, не очевидно, если доступно несколько iframes . Таким образом, рассматривая это <iframe> как уникальный iframe , вам нужно вызвать WebDriverWait при переключении на <iframe> следующим образом:

  • cssSelector

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[id^='vfFrameId_'][name^='vfFrameId_'][title='Deploy Data Set']")));
    
  • xpath

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@id,'vfFrameId_')][starts-with(@name,'vfFrameId_')][@title='Deploy Data Set']")));
    

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

  • xpath

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//div[@class='windowViewMode-normal oneContent active forcePageHost' and @data-aura-class='forcePageHost']//following::iframe[1]")));
    
0 голосов
/ 05 сентября 2018

Вот как вы можете найти индекс каждого элемента iframe

List <WebElement> options= driver.findElements(By.tagName("iframe"));
    for(WebElement e: options) {
        String index=e.getAttribute("index");
        System.out.println("Index for: "+e.getAttribute("name")+" is: "+index);// to print out name attribute and index
    }

Если вы переключаетесь с iframe на iframe, которые работают не всегда. Возможно, вам придется сначала переключиться на содержимое по умолчанию с iframe(1), а затем переключиться на iframe(2)

driver.switchTo().frame(your locator for 1st iframe here);// to switch to 1st iframe
// your action here
driver.switchTo().defaultContent();
driver.switchTo().frame(your locator for 2nd iframe here); // to switch to 2nd iframe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...