硒测试中如何选择第一个li元素?
Posted
技术标签:
【中文标题】硒测试中如何选择第一个li元素?【英文标题】:How to select the first li element in selenium test? 【发布时间】:2015-04-08 20:18:28 【问题描述】:标签的结构如截图所示
我正在尝试使用此 python 代码访问第一个 li
元素:
invitations = elem.find_element_by_css_selector('members-holder li#invitation-holder > :first-child')
elem
是一个非常***的元素,包含所有标签
我遇到了这个异常:
NoSuchElementException: Message: Unable to locate element: "method":"css selector","selector":"members-holder li#invitation-holder > :first-child"
我尝试了一些变化,但无法获得我想要的结果。选择上述元素的最佳方法是什么?
编辑
我在 chrome 的开发者控制台中尝试了一个替代的 css 选择器.members-holder .invitation-holder:first-child
,它可以工作。但是当我将它插入 python selenium 代码时,会抛出相同的异常。
【问题讨论】:
我认为是 el.find ,而不是 elem.find 它在任何框架/iframe 下吗?还是加载需要时间? @VivekSingh 你有一个很好的观点!一开始就隐藏了 然后你可以使用等待条件来获得可见性。乐于助人.. 【参考方案1】:首先,你应该修复你的 CSS 选择器:
.members-holder ul li.invitation-holder
而且,由于您需要第一个li
,因此只需使用find_element_by_css_selector()
method:
driver.find_element_by_css_selector('.members-holder ul li.invitation-holder')
除此之外,您可能需要explicitly wait for the element to become visible:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
...
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".members-holder ul li.invitation-holder"))
)
如果您仍然会在尝试访问该元素时遇到异常,请检查一个元素是否在 iframe
内 - 如果是,请先切换到它:
frame = driver.find_element_by_id('frame_id')
driver.switch_to.frame(frame)
# find the element
【讨论】:
switch_to.frame('id')
提示特别有用!【参考方案2】:
尝试使用这种方式识别元素。
WebElement parentDiv = driver.findElement(By.className("'members-holder"));
现在做
WebElement ul = parentDiv.findElement(By.tagName("ul"));
List<WebElement> lis = ul.findElements(By.tagName("li"));
第一个元素是
lis.get(0);
这是java代码。你可以在 python 中锻炼 equilent。 希望对您有所帮助。
【讨论】:
WebElement ul = parentDiv.findElements(By.tagName("ul"));
如何返回 SINGLE 元素?它应该返回一个列表
我的错误。我纠正了它。希望能帮助到你。 @Saifur 感谢您指出这一点。以上是关于硒测试中如何选择第一个li元素?的主要内容,如果未能解决你的问题,请参考以下文章
如何解决硒循环中的这个错误? InvalidSelectorException:消息:无效选择器:无法使用 xpath 定位元素