2017-06-06 248 views
0

考慮下面的HTML:硒蟒蛇選擇元素

<div class="nav-category__col" id="category_nav_level_3" style="display: block;"> 
    <input type="hidden" value="1" name="videogame_type" id="videogame_type"> 
    <ul class="nav-category__list" adparam_name="videogame_type" role="radiogroup"> 
     <li class="nav-category__list-item nav-category__list-item--selected" id="1" tabindex="-1" role="radio" aria-checked="true"> 
     <p class="nav-category__name">Consoles</p> 
     </li> 
     <li class="nav-category__list-item " id="2" tabindex="-1" role="radio" aria-checked="false"> 
     <p class="nav-category__name">Jogos</p> 
     </li> 
     <li class="nav-category__list-item " id="3" tabindex="-1" role="radio" aria-checked="false"> 
     <p class="nav-category__name">Acessórios</p> 
     </li> 
    </ul> 
</div> 

我想點擊<p class="nav-category__name">Consoles</p>所以我試着這樣做:

elem = driver.find_element_by_xpath("//*[@id="1"]/p") 
    elem.click() 

我發現這個XPath通過檢查元素和複製xpath,但它說「無法定位元素」。我怎麼能這樣做?

我不太瞭解HTML,但我可以通過id或名稱查找其他元素。

+0

檢查此elem = driver.find_element_by_xpath(「// * [@ id ='1']/p」) –

回答

0

嗯,我啞然:我試圖選擇一個元素之前它在頁面上。加入time.sleep(3)之前elem = driver.find_element_by_xpath("//*[@id="1"]/p")

0

喲不需要知道硒IDE任何HTML屬性,

https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ 

在Firefox瀏覽器安裝此用Exention(它的工作原理只是Firefox瀏覽器)。然後打開它,按下錄製按鈕,然後做你的scenerio。最後停止並導出用於Python或其他語言的代碼。如果你仔細看看ide,你可以看到任何屬性類型,比如'name,id,cssSelector,Xpath ...',你可以改變你想要的。

或者你的問題,

elem = driver.find_element_by_name("q") // Name 
elem = driver.find_element_by_id("q") // ID 
menu = driver.find_element_by_css_selector(".nav") // CssSelector 

你得到它:)

find_element_by_*methods 

有一個漂亮的代碼:)

+1

謝謝,但我解決它與driver.find_element_by_xpath()之前添加time.sleep(3)。反正也會試試這個插件! – Setti7

1

我會建議不要使用time.sleep()在腳本 因爲它暫停腳本修復持續時間,即使你的元素可在小於給定時間使用解決。

可以說你已經把time.sleep(5)所以這裏它完全暫停你的腳本5秒,即使你的元素在2秒內可用。

更好地克服這種情況的使用方式無論是Implicit WaitExplicit Wait

隱等待 -

的隱等待通知的webdriver試圖找到時輪詢DOM的時間一定 任何元素(或元素)不是立即可用的 。

driver.implicitly_wait(10) # seconds 

明確等待 -

一個明確的等待是你定義的代碼,然後再繼續等待一定的條件 發生代碼。

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "id")) 

refer this進一步。