2017-06-06 191 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进一步。