Selenium:在Wait of Expected_conditions中重用子元素的found元素

时间:2018-03-30 22:53:29

标签: python selenium

Selenium如何在Wait的Expected_conditions中重用已发现的元素?

示例html:

<p class="some">1<p>
<div class="content">
   <p class="other">2<p>
   <p class="some">3<p>
</div>

在简单的情况下可以使用:

elem = driver.find_element_by_css_selector('div.content')
elem.find_element_by_css_selector('p.some')

但是这样的事情不起作用:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 5)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content')))
elem.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.some')))

不幸的是,现在我必须每次都在Wait中写一个完整的选择器路径。这不舒服。

2 个答案:

答案 0 :(得分:2)

试试这个:

wait = WebDriverWait(driver, 5) elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content'))) psome = wait.until(lambda d:elem.find_element_by_css_selector('p.some'))

注意:我实际上并没有在Python中尝试过它,但我在C#和Java中使用了类似的技术,所以除非我有一些小的语法错误,否则我很确定它应该有用。

答案 1 :(得分:0)

根据WebDriverWait API文档,构造函数如下:

class selenium.webdriver.support.wait.WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
where-
    Constructor, takes a WebDriver instance and timeout in seconds.
    driver - Instance of WebDriver (IEDriverServer, GeckoDriver, ChromeDriver or RemoteWebDriver)

因此,当您声明 WebDriverWait 的实例时,您需要传递 WebDriver实例作为参数。也许传递 WebElement 的实例应该引发异常。

现在, WebDriverWait 是通过您创建的 WebDriverWait 实例实现的,如下所示:

wait = WebDriverWait(driver, 5)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content')))

现在,如果您再次想要诱导等待其他元素,您可以粗略重复以前的 WebDriverWait实例,如下所示:

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.some'))) # considering 'p.some' as unique.

否则你必须传递父节点以构建一个唯一的CSS_SELECTOR,如下所示:

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content p.some'))) # considering 'div.content p.some' as unique.