2015-09-05 80 views
7

此頁面的主菜單(linio)有11個鏈接。只對9(灰色背景和徘徊時顯示子菜單)感興趣。RSelenium:單擊不可見對象 - ElementNotVisibleException

我想單擊9個選項中的子菜單中的每個單個元素。期望的方法是:

1.-第一部分:「Celulares y Tablets」。
2. - 轉到:「Celulares y智能手機」。請點擊並看到此頁面。
3.提取一些數據(檢查,我已經能夠做到這一點)。

4.轉到「Celulares y Tablets」中的下一個子菜單。這是:「Accesorios Celular」。

5.提取一些數據,然後進入下一個子菜單。在完成了本節中的所有子菜單後,我將轉到下一個大節:「TV-Audio-y-Foto」。

等9個部分。

HTML Estructure

尋找源代碼,我到了這個:

1 .-主標題:主標題是 '導航' 標籤中:

<nav id="headerMainMenu> 

2.-在'nav'標籤內部是一個'ul',裏面的每個'il'對於9個部分中的每一個都有'id':

<nav id="headerMainMenu> 
    <ul> 
     <il id = "category-item-celulares-y-tablets"><a href="..."></il> 
     <il id = "category-item-celulares-y-tablets"><a href="..."></il> 
     <il id = "category-item-celulares-y-tablets"><a href="..."></il> 
    </ul> 
</nav> 

3.-的IL元素中,有包含我們需要的鏈接div元素:請注意<a>與類= 「subnav__title」。

<nav id="headerMainMenu> 
    <ul> 
     <il id = "category-item-celulares-y-tablets"><a href="..."> 
      <div class="col-3"> 
       <a href="..."class="subnav__title">TV y Video</a> 
     </il> 
     <il id = "category-item-celulares-y-tablets"><a href="..."></il> 
     <il id = "category-item-celulares-y-tablets"><a href="..."></il> 
    </ul> 
</nav> 

4.-使用RSelenium去每個部分:

library(RSelenium) 
library(rvest) 
#start RSelenium 
checkForServer() 

startServer() 

remDr <- remoteDriver() 

remDr$open() 

#navigate to your page 
remDr$navigate("http://www.linio.com.pe/") 


#Accesing the first submenu from "Category Celulares y Tablets 
webElem <- remDr$findElement(using = 'css', value = "#category-item-celulares-y-tablets a.subnav__title") 


webElem$sendKeysToElement(list(key = "enter")) 

但這樣做顯示了這個錯誤:

> webElem$sendKeysToElement(list(key = "enter")) 
Error: Summary: StaleElementReference 
    Detail: An element command failed because the referenced element is no longer attached to the DOM. 
    class: org.openqa.selenium.StaleElementReferenceException 

*我覺得這question可能是幫幫我。但我不明白。

**我認爲我的CSS是好的。

回答

0

如果有問題的元素的任何父元素具有屬性'display:invisible',那麼它的所有子元素對於selenium都是不可見的,因此您必須使用JavaScript來破解這種場景,然後使用Javascript單擊它單擊。注意:它可能有不利影響。

1

我對Python使用了下面的代碼。我確信它可以轉換爲您的語言:

def click_hidden(self, css_selector): 
    ''' 
    Click on a hidden element using javascript. 

    Selenium will error if the element doesn't excist and if javascript fails 

    REASON: Selenium doesn't allow clicks on hidden elements since the user won't either 
      So be sure the element would be visible in normal uses! 
    ''' 
    element = self.find_css(css_selector) 
    self.execute_script("$(arguments[0]).click();", element) 
    return element 
+0

感謝您的試用,@MatZeg。我認爲翠有答案。我需要測試它才能給他充分的信用。但是,謝謝! –

1

您需要先點擊父級菜單。然後當子菜單可見時,點擊子菜單。

parentMenuElement <- remDr$findElement(
    using = 'css', 
    value = "#category-item-celulares-y-tablets") 
parentMenuElement.click() 

childMenuElement <- remDr$findElement(
    using = 'css', 
    value = "#category-item-celulares-y-tablets a.subnav__title") 
childMenuElement.click() 

您可能還需要關閉偶爾出現的模式彈出窗口。

+0

謝謝Chui,我會試試這個。你可以發佈並更新包含關於彈出窗口的部分嗎?如何解僱它?謝謝! –

+0

不幸的是,彈出窗口對我來說並沒有再次出現。你應該通過CSS找到[x]按鈕,如果有的話點擊它。 –

+0

嗨Chui,我不明白爲什麼需要點擊主菜單?在普通的瀏覽器中,它是在「懸停」而不是「點擊」時激活的。請你可以解釋一下嗎? –