2013-04-06 83 views
-1

我試圖使用Selenium WebDriver爲YouTube上的FireFox自動執行任務。如何使用Selenium WebDriver在網頁上查找元素?

我在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("[email protected]") 
    print hr 
+3

你真的需要展示你的嘗試。 –

+0

@RossPatterson添加了我試過的代碼。任何投入將非常感激。 – abhi

+0

你有3種使用'find_element_by_partial_link_text()'。他們沒有一個來到與您展示的HTML片段相匹配的地方。 –

回答

-1

你可以通過簡單的字符串操作的鏈接。

在變量中加載字符串,用空格分隔字符串,第二個元素會給你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]

+0

感謝您的答案。但我有100多個視頻播放列表,我認爲手動複製html效率不高。我試圖自動執行任務 – abhi

+0

我認爲你已經爲每個視頻分開文件,反正你總是可以使用字符串操作從頁面的html源代碼中提取所有視頻的html。 – scottydelta

+0

哦,恐怖!這是Selenium代碼,API有很多方法可以使這種事情變得更容易。給定一個元素'blah',就像driver.find_elements_by_tagname(「a」)中的元素那樣簡單:print element.get_attribute(「href」);'就可以完成這項工作。 –

1

嘗試通過獲得鏈接: String hrefSpecs = driver.findelement(By.cssSelector("a.yt-uix-tile-link.yt-uix-sessionlink")).getAttribute("href")

通常你

/watch?v=StJLvbPIvTw&amp;list=PLt5xbw4ekDQssXxfaIfh_XbKe-iuOTZo_&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<String> listLink = driver.findElements(By.cssSelector("a.yt-uix-tile-link.yt-uix-sessionlink")).getAttribute("href");

你將用foreach和前面的子字符串等迭代它。我讓你測試並告訴我你是否有問題。

編輯:WebElement是不可迭代的,List<WebElement>[]在你的情況下是可迭代的。我用Java編寫了它,我希望你能「翻譯」它=)

相關問題