【问题标题】:Unable to find elements by class name using Selenium/Python 2.7无法使用 Selenium/Python 2.7 按类名查找元素
【发布时间】:2015-08-23 14:45:11
【问题描述】:

我正在尝试从谷歌翻译“检测语言”下拉菜单中选择所有可用的语言,以便我可以自动进行一些翻译。

我没有收到任何语法错误,但是“find_elements_by_class_name”方法(我认为它可以获取所有语言)出现空。

from selenium import webdriver
fire = webdriver.Firefox()
fire.get("http://translate.google.com")
sl_dropdown = fire.find_element_by_id("gt-sl-gms")  # dropdown menu
# returns empty list
sl_dropdown.find_elements_by_class_name("goog-menuitem-content")

我刚开始使用 Selenium,所以我确定我缺少一些东西。感谢您的帮助。

【问题讨论】:

  • 您为什么期望找到任何'goog-menuitem-content' 元素?检查页面时我没有看到任何内容。
  • @jonrsharpe 单击下拉菜单并单击“检查元素”后,“goog-menuitem-content”是任何给定语言的类名,除非我弄错了。

标签: python selenium google-translate


【解决方案1】:

有几个问题。

一件事情,因为您是 Selenium 的新手... Selenium 只会与用户可以看到的元素交互。因此,如果下拉菜单未打开以暴露元素,则无法从下拉菜单中获取语言列表。要解决这个问题,只需在按类名拉取元素之前单击一下即可。

另一个问题是包含语言名称的元素不是 id = "gt-sl-gms" 的DIV 的子元素。如果您查看 HTML,带有语言的菜单在 HTML 中都位于较低的位置。所以你需要调整你的搜索,不要只寻找sl_dropdown的孩子。

我不知道 python,但希望这是正确的和/或可以让你朝着正确的方向前进。

from selenium import webdriver
fire = webdriver.Firefox()
fire.get("http://translate.google.com")
sl_dropdown = fire.find_element_by_id("gt-sl-gms")  # dropdown menu
sl_dropdown.click() # opens the languages menu so its accessible to Selenium
langs = fire.find_elements_by_css_selector("#gt-sl-gms-menu div.goog-menuitem-content")
for lang in langs:
    print lang.text  # dumps the text in each WebElement

顺便说一句,CSS 选择器#gt-sl-gms-menu div.goog-menuitem-content 意味着获取一个 id (#) 为 gt-sl-gms-menu 的元素,该元素具有类 (.) goog-menuitem-content 的后代 DIV。希望这是有道理的。网上有很多关于 CSS 选择器的好教程。我经常使用this page 作为参考。


编辑 1: 这是我在 Java 中用来转储语言的代码。

driver.get("http://translate.google.com");
driver.findElement(By.id("gt-sl-gms")).click();
List<WebElement> langs = driver.findElements(By.cssSelector("#gt-sl-gms-menu div.goog-menuitem-content"));
for (WebElement lang : langs)
{
    System.out.println(lang.getText());
}

【讨论】:

  • 这就是我要找的,谢谢。但这会返回一个 webelement 对象列表,我不确定如何获取它们的文本。 lang.text 为每个对象返回 "u''",而 get_element("value") 给了我同样意想不到的东西。
  • 我不知道 python,但是如果你遍历所有 langs 实例并转储 langs.text 它应该打印语言......至少它在 Java 中是这样。我不确定为什么会有所不同。我在 Java 中添加了工作代码,以防它对您或其他人有所帮助。
  • 根据被拒绝的@NoSuchElephantException 建议的修订进行了更新。谢谢!
【解决方案2】:

它适用于我的机器。如果我之后打电话给click(),语言的下拉列表会打开:

from selenium import webdriver
fire = webdriver.Firefox()
fire.get("http://translate.google.com")
sl_dropdown = fire.find_element_by_id("gt-sl-gms")  # dropdown menu
sl_dropdown.click()

我使用 Python 2.7.6,Selenium 2.47.1

【讨论】:

  • 我不只是想获得下拉菜单(应该更清楚)。我正在尝试选择个别语言,即提出一个类似 ["Albanian", "Armenian"] 的列表
猜你喜欢
  • 2020-05-19
  • 2015-07-12
  • 2020-03-05
  • 2021-03-05
  • 2023-01-03
  • 1970-01-01
  • 2021-09-20
  • 2016-06-08
相关资源
最近更新 更多