考虑以下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或名称查找其他元素。
答案 0 :(得分:1)
我建议您不要在脚本中使用time.sleep()
因为它会暂停你的脚本以修复持续时间,即使你的元素可以在给定的时间内使用。
让我们说你已经把time.sleep(5)
放在这里,即使你的元素在2秒内可用,它也会让你的脚本暂停5秒钟。
克服这种情况的更好方法是使用Implicit Wait
或Explicit 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")
来解决问题