it-roy-ru.com

Как идентифицировать и переключиться на фрейм в веб-драйвере Selenium, если у фрейма нет идентификатора

Может кто-нибудь сказать мне, как я могу определить и переключиться на iframe, который имеет только заголовок?

<iframe frameborder="0" style="border: 0px none; width: 100%; height: 356px; min-width: 0px; min-height: 0px; overflow: auto;" dojoattachpoint="frame" title="Fill Quote" src="https://tssstrpms501.corp.trelleborg.com:12001/teamworks/process.lsw?zWorkflowState=1&zTaskId=4581&zResetContext=true&coachDebugTrace=none">

Я пробовал по приведенному ниже коду, но он не работает 

driver.switchTo().frame(driver.findElement(By.tagName("iframe")));
25
Sunil wali

вы можете использовать cssSelector,

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));
25
Amith

driver.switchTo().frame() имеет несколько перегрузок.

  1. driver.switchTo().frame(name_or_id)
    Здесь у вашего iframe нет идентификатора или имени, так что не для вас.

  2. driver.switchTo().frame(index)
    Это последний вариант, потому что использование индекса недостаточно стабильно, как вы можете себе представить. Если это ваш единственный iframe на странице, попробуйте driver.switchTo().frame(0)

  3. driver.switchTo().frame(iframe_element)
    Самый распространенный. Вы размещаете свой iframe как другие элементы, а затем передаете его в метод.

Здесь лучше всего найти его по атрибутам title.

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));
// driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@title='Fill Quote']")));
37
Yi Zeng

Вы также можете использовать src для переключения на фрейм, вот что вы можете использовать:

driver.switchTo().frame(driver.findElement(By.xpath(".//iframe[@src='https://tssstrpms501.corp.trelleborg.com:12001/teamworks/process.lsw?zWorkflowState=1&zTaskId=4581&zResetContext=true&coachDebugTrace=none']")));
4
Shawn Ghavami

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

driver.switchTo().defaultContent();
driver.switchTo().frame(x);

x может быть номером фрейма или вы можете ввести driver.findlement и использовать любой из доступных вариантов, например: driver.findElementByName("Name").

3
user6147581

Вы можете использовать Css Selector или Xpath:

Подход 1: CSS-селектор

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[title='Fill Quote']")));

Подход 2: Xpath

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@title='Fill Quote']")));

https://seleniumatfingertips.wordpress.com/2016/07/05/handling-frames-in-Selenium-webdriver-with-Java/

2
Jackin Shah

1) Перейти к просмотру HTML 

2) введите iframe и найдите нужный кадр, посчитайте значение и переключитесь на него, используя

oASelFW.driver.switchTo().frame(2); 

если это первый кадр, используйте oASelFW.driver.switchTo().frame(0); 

если это второй кадр, используйте соответственно oASelFW.driver.switchTo().frame(1);

2
Ajay

Есть три способа переключения на кадр

1)Can use id
2)Can use name of the frame
3)Can use WebElement of the frame

2 -> driver.switchTo().frame("name of the frame");

1
Kiran Kumar

Самый простой способ сделать это так. Если это фрейм, вы можете щелкнуть правой кнопкой мыши на поле и, если вы видите выбор «открыть фрейм во вкладке», сделайте это.

Затем возьмите URL фрейма, и это то, что вы вставили в скрипт Python, используя «driver.get ( http: // blah blah ..)

Тогда Selenium может найти ваш названный элемент. Это сэкономило мне много времени на то, чтобы попробовать все предложения, о которых я узнал, но не сработал. Проблема с моим была в кадре.

Я использую Linux, который дает мне возможность щелкнуть правой кнопкой мыши на открытии фрейма в другой вкладке. Я не пользуюсь Windows, поэтому не знаю, появится ли эта опция в контекстном меню.

Ganzarola

1
Ganz

Я боролся с этим в течение a while; у особенно разочаровывающего сайта было несколько вложенных фреймов по всему сайту. Я не мог найти способ идентифицировать фреймы - без имени, id, xpath, css selector - ничего.

В конце концов я понял, что кадры нумеруются, причем верхним уровнем является кадр (0), второй кадр (1) и т.д.

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

Потратил слишком много времени на эту проблему для такого простого решения -_-

driver.switch_to.default_content()
for x in range(50):
    try:
        driver.switch_to.frame(x)
        driver.find_element_by_xpath("//*[@id='23']").click()
        driver.find_element_by_xpath("/html/body/form/table/tbody/tr[1]/td/ul/li[49]/a").click()
    except:
        print("It's not: ", x)
        continue
0
Bilbo Swaggins