用selenium python选择元素

时间:2017-06-06 00:53:14

标签: python html selenium

考虑以下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,但它说&#34;无法找到元素&#34;无论如何。我怎么能这样做?

我不太了解HTML,但我能够通过id或名称查找其他元素。

3 个答案:

答案 0 :(得分:1)

我建议您不要在脚本中使用time.sleep() 因为它会暂停你的脚本以修复持续时间,即使你的元素可以在给定的时间内使用。

让我们说你已经把time.sleep(5)放在这里,即使你的元素在2秒内可用,它也会让你的脚本暂停5秒钟。

克服这种情况的更好方法是使用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进一步了解。

答案 1 :(得分:0)

哟不需要知道Selenium IDE的任何HTML属性,

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

在Firefox浏览器中安装此功能(它适用于Firefox)。然后打开它,按下录制按钮,然后执行您的场景。最后停止并导出Python或其他语言的代码。如果您环顾四周,您可以看到任何属性类型,例如&name; name,id,cssSelector,Xpath ......&#39;你可以改变你想要的那个。

或者你的问题,

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

有一个很好的代码:)

答案 2 :(得分:0)

嗯,我很蠢:我试图在页面上选择一个元素。通过在time.sleep(3)

之前添加elem = driver.find_element_by_xpath("//*[@id="1"]/p")来解决问题