【问题标题】:How to find an element on a webpage using Selenium WebDriver?如何使用 Selenium WebDriver 在网页上查找元素?
【发布时间】:2013-04-06 21:32:54
【问题描述】:

我尝试在 YouTube 上使用 Selenium WebDriver for FireFox 自动执行一项任务。

我在 YouTube 上创建了一个播放列表,我想获取该播放列表中所有视频的超链接。

html 看起来像这样:

<a href="/watch?v=StJLvbPIvTw&amp;list=PLt5xbw4ekDQssXxfaIfh_XbKe-iuOTZo_&amp;index=1" title="ADELE - Skyfall (Official video HD)" class="yt-uix-tile-link yt-uix-sessionlink" data-sessionlink="feature=plpp_video&amp;ei=RodgUazfOKWlhAHOioGoDA">
    <span class="title video-title" dir="ltr">ADELE - Skyfall (Official video HD)</span>
  </a>

我尝试使用find_by_partial_link_text 查找元素但失败了。

我的最终目的是获取播放列表中所有视频的超链接,以便我可以将其传递给下一个脚本以单独访问它们。 任何帮助将不胜感激。

注意:我在 SO 中找到了与 SO 类似的答案,但此处提供的答案是迭代 WebElement 对象,在我的情况下会引发异常,说对象不可迭代。

编辑:

def init():

    d = webdriver.Firefox()
    d.implicitly_wait(15)
    print "in init"
    return d

def youtube(d, uname, pwd):

    link_list = []
    d.get("http://www.youtube.com")
    print "in you"
    signin = d.find_element_by_partial_link_text("Sign in")
    signin.click()

    email = d.find_element_by_id("Email")
    passwo = d.find_element_by_id("Passwd")
    submit = d.find_element_by_id("signIn")

    email.send_keys(uname)
    passwo.send_keys(pwd)
    submit.click()

    list = d.find_element_by_partial_link_text("Playlists")
    list.click()

    play = d.find_element_by_partial_link_text("Fav songs")
    play.click()
    print play

    link_list = d.find_element_by_xpath('//*[@id="playlist-pane-container"]/div[1]')
    print "done"
    print link_list # prints None here
    hr = link_list.get_attribute("css=a@href")
    print hr

【问题讨论】:

  • 你真的需要展示你尝试过的东西。
  • @RossPatterson 添加了我尝试过的代码。任何意见将不胜感激。
  • 您有 3 次使用 find_element_by_partial_link_text()。它们都没有与您显示的 HTML 片段相匹配。
  • @RossPatterson 我第一次尝试使用 'find_element_by_partial_text()' 来做到这一点,但它没有帮助,所以我尝试使用 xpath 在页面上查找所有类似的元素所以问题stackoverflow.com/questions/8121886/… 但我得到一个空列表。
  • 投反对票的具体原因有哪些?

标签: python windows firefox selenium selenium-webdriver


【解决方案1】:

尝试通过以下方式获取链接: String hrefSpecs = driver.findelement(By.cssSelector("a.yt-uix-tile-link.yt-uix-sessionlink")).getAttribute("href")

通常你会得到

/watch?v=StJLvbPIvTw&amp;amp;list=PLt5xbw4ekDQssXxfaIfh_XbKe-iuOTZo_&amp;amp;index=1

所以你的子字符串喜欢:

String sublink = hrefSpecs.substring(0,20); // check the 20 i'm not sure

你会得到

/watch?v=StJLvbPIvTw

既然你得到了这个,你就可以写这样的东西

String youtube = "www.youtube.com";
String link = youtube + sublink;

你终于得到了:www.youtube.com/watch?v=StJLvbPIvTw

但是,如果您有一个包含所有链接的页面,您将构建类似的内容:

List&lt;String&gt; listLink = driver.findElements(By.cssSelector("a.yt-uix-tile-link.yt-uix-sessionlink")).getAttribute("href");

然后你会用 foreach 和以前的子字符串等进行迭代。我让你测试并告诉我你是否有问题。

编辑:WebElement 不可迭代,List&lt;WebElement&gt;[] 在您的情况下是可迭代的。我用 Java 写的,希望你能“翻译”一下 =)

【讨论】:

    【解决方案2】:

    你可以通过简单的字符串操作获得链接。

    将字符串加载到变量中,用空格分割字符串,第二个元素会给你href +链接,删除href部分你会得到链接。

    试试这个

    html = '<a href="/watch?v=StJLvbPIvTw&amp;list=PLt5xbw4ekDQssXxfaIfh_XbKe-iuOTZo_&amp;index=1" title="ADELE - Skyfall (Official video HD)" class="yt-uix-tile-link yt-uix-sessionlink" data-sessionlink="feature=plpp_video&amp;ei=RodgUazfOKWlhAHOioGoDA"> <span class="title video-title" dir="ltr">ADELE - Skyfall (Official video HD)</span> </a>'

    parts = html.split(" ")

    link = parts[1][6:-1]

    【讨论】:

    • 感谢您的回答。但我的播放列表中有 100 多个视频,我认为手动复制 html 效率不高。我正在尝试自动化任务
    • 我以为每个视频都有单独的文件,无论如何,您始终可以使用字符串操作从页面的 html 源中提取所有视频的 html。
    • 哦,太恐怖了!这是 Selenium 代码,API 有很多方法可以让这种事情变得更容易。给定一个元素&lt;a href="..."&gt;blah&lt;/a&gt;,像for element in driver.find_elements_by_tagname("a"): print element.get_attribute("href"); 这样简单的东西就可以完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 2017-09-12
    • 2023-01-25
    • 1970-01-01
    • 2014-07-18
    • 2020-05-18
    • 2023-01-22
    • 1970-01-01
    相关资源
    最近更新 更多