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中写一个完整的选择器路径。这不舒服。
答案 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.