Python Selenium:在预期的_条件下为子级重用找到的元素

Python Selenium:在预期的_条件下为子级重用找到的元素,python,selenium,Python,Selenium,在Selenium中,如何在Wait的预期条件下为子级重用找到的元素 html示例: <p class="some">1<p> <div class="content"> <p class="other">2<p> <p class="some">3<p> </div> 但这样的事情是行不通的: from selenium.webdriver.support.ui import WebD

在Selenium中,如何在
Wait
的预期条件下为子级重用找到的元素

html示例:

<p class="some">1<p>
<div class="content">
   <p class="other">2<p>
   <p class="some">3<p>
</div>
但这样的事情是行不通的:

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')))
不幸的是,现在我每次都必须在等待中编写一个完整的选择器路径。不舒服。

根据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)
wait = WebDriverWait(driver, 5)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content')))
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.some'))) # considering 'p.some' as unique.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content p.some'))) # considering 'div.content p.some' as unique.
因此,当您声明WebDriverWait的实例时,需要将WebDriver实例作为参数传递。传递WebElement的实例可能会引发异常

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

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)
wait = WebDriverWait(driver, 5)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content')))
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.some'))) # considering 'p.some' as unique.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content p.some'))) # considering 'div.content p.some' as unique.
现在,如果您再次希望诱导等待某些其他元素,您可以重新使用以前的WebDriverWait实例,如下所示:

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)
wait = WebDriverWait(driver, 5)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content')))
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.some'))) # considering 'p.some' as unique.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content p.some'))) # considering 'div.content p.some' as unique.
否则,还必须传递父节点以构造唯一的CSS_选择器,如下所示:

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)
wait = WebDriverWait(driver, 5)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content')))
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'p.some'))) # considering 'p.some' as unique.
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.content p.some'))) # considering 'div.content p.some' as unique.
试试这个:

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中使用了很多类似的技术,所以除非我有一些小的语法错误,否则我很确定它应该可以工作。

你不能调用
wait
作为
elem
的实例方法。一种方法是将需要查找的所有元素存储在
page_object.py
中,然后将其作为模块导入,并在任何时候重用元素。您能编写示例吗?这是我的问题。但是我想重用在
wait
中找到的元素。没有太多细节,lambda就像一个内部函数。Wait.until反复调用此函数,直到它返回除nil以外的任何值并且不引发异常为止。事实上,所有预期的_条件方法都返回这样的函数。