Найдите элемент в наборе кадров и тегах frame и div, используя селен - PullRequest
0 голосов
/ 17 марта 2020

Я хочу найти тег div "item1" в следующем DOM. Я пробовал по-разному. Но я не мог этого сделать.

<html></html>
<frameset    ... >
<frame>
</frame>
<frame  id= "dynamic value" name = "dynamic value">
<html >
   <head></head>
   <body>
      <div name = "item1">
      <div name = "item2">

Итак, я попытался найти его следующими способами. Но такого исключения не было.

driver.getElementsByTagName("frame")[1].getElementsByTagName("div")[0]
driver.swithTo().frame(1);
driver.getElementsByTagName("div")[0]

Ответы [ 3 ]

1 голос
/ 17 марта 2020

getElementsByTagName() Метод DOM в JavaScript Источник

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

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

driver.swithTo().frame(1); // index = 1 means 2nd frame
driver.findElements(By.tagName("div"))[0]

И с условиями ExplicitWait (чтобы избежать проблем, связанных с синхронизацией)

WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameName);
1 голос
/ 17 марта 2020

Есть несколько вещей, которые вы должны учитывать:

  • Использование Селен при работе с <iframe> вы можете спокойно игнорировать <frameset>
  • Было бы трудно определить желаемый <iframe> по их индексу , так как это будет неубедительным, который <iframe> загружается быстрее.
  • Поскольку требуемый элемент находится в пределах <iframe> Итак, чтобы найти элемент, вы должны:
    • Induce WebDriverWait для нужного frameToBeAvailableAndSwitchToIt().
    • Induce WebDriverWait для нужного visibilityOfElementLocated() .
  • Вы можете использовать одну из следующих стратегий локатора :

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

      new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe#dynamicValue[name='dynamicValue']")));
      WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div[name='item1']")));
      
    • Использование XPATH:

      new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@id='dynamicValue' and @name='dynamicValue']")));
      WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@name='item1']")));
      

Ссылка

Вы можете найти множество соответствующих обсуждений в:

1 голос
/ 17 марта 2020

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

Попробуйте это:

frame = driver.getElementsByTagName("frame")[1]
driver.swithTo().frame(frame);
driver.getElementsByTagName("div")[0]

Обратите внимание, я не уверен, что такое getElementsByTagName() Это похоже на какой-то пользовательский метод для findElement(), поэтому я просто скопировал его в свое решение из вашего примера.

...