2017-04-09 112 views
0

我刚开始使用硒,但在阅读完文档之后,我无法理解如何正确执行等待(使用EC),直到webdriver标识元素的存在这是另一个元素的孩子。Selenium - 等到另一个元素的子元素存在

让我解释一下。我想,我可以在2个步骤访问特定的元素:

#find major group 
listings = driver.find_element_by_id("new-listings"); 

#find subelement 
checkbox = listings.find_element_by_class_name("listing-category") 

这是确定的,但我想用EC以确保checkbox存在。我不能用像水木清华:

checkbox = driver.wait.until(EC.presence_of_element_located(
       (By.CLASS_NAME, "listing-category"))) 

只是因为有很多其他的类似listing-category元素。可悲的是,找到checkbox的唯一方法是通过嵌套的请求(如前所述)(它没有任何id或其他)。

如何正确表达它?

小额外问题:一般来说,使用EC而不是仅仅击中元素并希望它们已经可用,这对于性能来说是非常糟糕的吗? 99%的时间我不需要等待元素出现,所以我只是尝试处理浏览器响应不如平常的罕见情况。但我不确定EC是否会为创建事件处理程序等引入大量开销。

回答

1

我建议您使用CSS选择器一次完成此操作。您可以使用您正在描述的方法,但使用CSS选择器可以使用单个定位器查找元素的子元素。在这种情况下,CSS选择器将是#new-listings .listing-category。在CSS选择器中,#表示一个ID,.表示一个类名。两部分之间的空间表示后代。如果您想要一个孩子(直系后代),您可以使用>,例如#new-listings > .listing-category

对于您关于EC和性能的问题,不,它不会减慢速度。它总是立即检查条件是否为真,如果不是,则等待,因此通常不会增加等待。

如果您是CSS选择器的新手,那么您可以阅读以下链接并了解它们。他们是非常强大和快速的定位器。

CSS selector reference

CSS selector tips

Advanced CSS selectors

+0

谢谢你,杰夫,是非常有意义! –