Как в EC.presence_of_element_located указать что бы искал у родителя

python
webdriver
Теги: #<Tag:0x00007fedbfc26640> #<Tag:0x00007fedbfc264d8>

(Александр Лашенко) #1

Есть код

wait = WebDriverWait(driver, 10)

pl_ctrl = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(( By.XPATH, “//div[contains(@class, ‘bar__content’)]” ))
)

pl_ctrl = pl_ctrl.find_element_by_xpath(".//div[@class=‘player-controls’]")

inf_curent_track = wait.until( EC.presence_of_element_located((By.XPATH, “.//div[@class=‘player-controls__track-container’]/div/div/div[1]”)) )

как сделать что бы inf_curent_track искал в pl_ctrl ?
Помогите плиз


(Дмитрий Мирошник) #2

Если я ничего не напутал, Вы ищете потомка pl_ctrl.

Самый простой вариант:

el1_xpath = "//div[contains(@class, 'bar__content')]"
el2_xpath = el1_xpath + "//div[@class='player-controls__track-container']/div/div/div[1]"

Ищет всех потомков el1_xpath по указанном пути.
Почитайте вот это
http://onedev.net/post/458


(Александр Лашенко) #3

Да , можно сделать полный путь //div[contains(@class, ‘bar__content’)]//div[@class=‘player-controls__track-container’]/div/div/div[1]. Я думал может быть, есть способ как то задать ему искать у родителя.


(Oleg Kuzovkov) #4
pl_ctrl = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located(( By.CSS_SELECTOR, "div.bar__content" ))
    )
pl_ctrl = pl_ctrl.find_element_by_css_selector(".player-controls")

inf_curent_track = WebDriverWait(pl_ctrl, 10).until(EC.presence_of_element_located((By.XPATH, ".//div[@class='player-controls__track-container']/div/div/div[1]"))) # тут тоже сделайте CSS

Вот так.


(Сергей Кузьмин) #5

@Oleg_Kuzovkov в голом Selenium на java по-моему так не получится WebDriverWait конструктор ожидает WebDriver первым аргументом и привести RemoteWebElement к этому типу вроде не получается - подскажите можно ли ислользовать stock Selenium ExpectedConditions или только писать свои лямбды с FluentWait типа

Wait<WebElement> waitElementChildren = new FluentWait<WebElement>(
				parentElement).withTimeout(flexibleWait, TimeUnit.SECONDS)
						.pollingEvery(pollingInterval, TimeUnit.MILLISECONDS)
						.ignoring(NoSuchElementException.class);
		childElement = waitElementChildren
				.until(new Function<WebElement, WebElement>() {
					public WebElement apply(WebElement parent) {
						return parent
								.findElements(By.cssSelector(...))
								.get(0);
					}
				});
		// Assert
		assertThat(childElement, notNullValue());


(Oleg Kuzovkov) #6

В JAVA все супер строго типизировано. Нашел старый кусок кода где я это решил вот так:

            WebDriver driver = Browser.getDriver();
            WebDriverWait wait = new WebDriverWait(driver, seconds);
	        WebElement parentElement = driver.findElement([parent_locator]);
            element = wait.until(ExpectedConditions.presenceOfNestedElementLocatedBy(parentElement, [locator_of_a_child]));

Сори если чуть с синтаксисом ошибся, с JAVA не работаю уже 2 года (к счастью :slight_smile: )
Это должно Вам помочь.


(Сергей Кузьмин) #7

о я и забыл какое там море cтатических методов … presenceOfNestedElementLocatedBy это круто прямо не jave a PHP какой то :smile: -)
http://javadox.com/org.seleniumhq.selenium/selenium-support/2.53.0/org/openqa/selenium/support/ui/ExpectedConditions.html

org.openqa.selenium.support.ui.ExpectedConditions

Modifier and Type	Method and Description

static ExpectedCondition<org.openqa.selenium.Alert>	alertIsPresent() 
static ExpectedCondition<Boolean>	and(ExpectedCondition<?>... conditions)

static ExpectedCondition<Boolean>	attributeContains(org.openqa.selenium.By locator, String attribute, String value)
static ExpectedCondition<Boolean>	attributeContains(org.openqa.selenium.WebElement element, String attribute, String value)
static ExpectedCondition<Boolean>	attributeToBe(org.openqa.selenium.By locator, String attribute, String value)
static ExpectedCondition<Boolean>	attributeToBe(org.openqa.selenium.WebElement element, String attribute, String value)
static ExpectedCondition<Boolean>	attributeToBeNotEmpty(org.openqa.selenium.WebElement element, String attribute)
static ExpectedCondition<Boolean>	elementSelectionStateToBe(org.openqa.selenium.By locator, boolean selected) 
static ExpectedCondition<Boolean>	elementSelectionStateToBe(org.openqa.selenium.WebElement element, boolean selected)
static ExpectedCondition<org.openqa.selenium.WebElement>	elementToBeClickable(org.openqa.selenium.By locator)
static ExpectedCondition<org.openqa.selenium.WebElement>	elementToBeClickable(org.openqa.selenium.WebElement element)
static ExpectedCondition<Boolean>	elementToBeSelected(org.openqa.selenium.By locator) 
static ExpectedCondition<Boolean>	elementToBeSelected(org.openqa.selenium.WebElement element)
static ExpectedCondition<org.openqa.selenium.WebDriver>	frameToBeAvailableAndSwitchToIt(org.openqa.selenium.By locator)
static ExpectedCondition<org.openqa.selenium.WebDriver>	frameToBeAvailableAndSwitchToIt(int frameLocator)
static ExpectedCondition<org.openqa.selenium.WebDriver>	frameToBeAvailableAndSwitchToIt(String frameLocator)
static ExpectedCondition<org.openqa.selenium.WebDriver>	frameToBeAvailableAndSwitchToIt(org.openqa.selenium.WebElement frameLocator)
static ExpectedCondition<Boolean>	invisibilityOfAllElements(List<org.openqa.selenium.WebElement> elements)
static ExpectedCondition<Boolean>	invisibilityOfElementLocated(org.openqa.selenium.By locator)
static ExpectedCondition<Boolean>	invisibilityOfElementWithText(org.openqa.selenium.By locator, String text)
static ExpectedCondition<Boolean>	javaScriptThrowsNoExceptions(String javaScript)
static ExpectedCondition<Object>	jsReturnsValue(String javaScript)
static ExpectedCondition<Boolean>	not(ExpectedCondition<?> condition)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	numberOfElementsToBe(org.openqa.selenium.By locator, Integer number)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	numberOfElementsToBeLessThan(org.openqa.selenium.By locator, Integer number)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	numberOfElementsToBeMoreThan(org.openqa.selenium.By locator, Integer number)
static ExpectedCondition<Boolean>	numberOfwindowsToBe(int expectedNumberOfWindows)
static ExpectedCondition<Boolean>	numberOfWindowsToBe(int expectedNumberOfWindows) 
static ExpectedCondition<Boolean>	or(ExpectedCondition<?>... conditions)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	presenceOfAllElementsLocatedBy(org.openqa.selenium.By locator)
static ExpectedCondition<org.openqa.selenium.WebElement>	presenceOfElementLocated(org.openqa.selenium.By locator)
static ExpectedCondition<org.openqa.selenium.WebElement>	presenceOfNestedElementLocatedBy(org.openqa.selenium.By locator, org.openqa.selenium.By sub_locator)
static ExpectedCondition<org.openqa.selenium.WebElement>	presenceOfNestedElementLocatedBy(org.openqa.selenium.WebElement element, org.openqa.selenium.By sub_locator)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	presenceOfNestedElementsLocatedBy(org.openqa.selenium.By locator, org.openqa.selenium.By sub_locator)
static <T> ExpectedCondition<T>	refreshed(ExpectedCondition<T> condition)
static ExpectedCondition<Boolean>	stalenessOf(org.openqa.selenium.WebElement element)
static ExpectedCondition<Boolean>	textMatches(org.openqa.selenium.By locator, Pattern pattern)
static ExpectedCondition<Boolean>	textToBe(org.openqa.selenium.By locator, String value)
static ExpectedCondition<Boolean>	textToBePresentInElement(org.openqa.selenium.By locator, String text)
static ExpectedCondition<Boolean>	textToBePresentInElement(org.openqa.selenium.WebElement element, String text)
static ExpectedCondition<Boolean>	textToBePresentInElementLocated(org.openqa.selenium.By locator, String text)
static ExpectedCondition<Boolean>	textToBePresentInElementValue(org.openqa.selenium.By locator, String text)
static ExpectedCondition<Boolean>	textToBePresentInElementValue(org.openqa.selenium.WebElement element, String text)
static ExpectedCondition<Boolean>	titleContains(String title)
static ExpectedCondition<Boolean>	titleIs(String title)
static ExpectedCondition<Boolean>	urlContains(String fraction)
static ExpectedCondition<Boolean>	urlMatches(String regex)
static ExpectedCondition<Boolean>	urlToBe(String url)
static ExpectedCondition<org.openqa.selenium.WebElement>	visibilityOf(org.openqa.selenium.WebElement element)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	visibilityOfAllElements(List<org.openqa.selenium.WebElement> elements)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	visibilityOfAllElementsLocatedBy(org.openqa.selenium.By locator)
static ExpectedCondition<org.openqa.selenium.WebElement>	visibilityOfElementLocated(org.openqa.selenium.By locator)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	visibilityOfNestedElementsLocatedBy(org.openqa.selenium.By locator, org.openqa.selenium.By sub_locator)
static ExpectedCondition<List<org.openqa.selenium.WebElement>>	visibilityOfNestedElementsLocatedBy(org.openqa.selenium.WebElement element, org.openqa.selenium.By sub_locator)

спасибо


(Oleksandr Khotemskyi) #8

Из-за этого я и считаю что официальные биндинги слишком низкоуровневые. Зацени насколько все проще с ленивыми элементами:

const pl_ctrl = $('div.player-controls')
const inf_curent_track = pl_ctrl.element(by.xpath(".//div[@class='player-controls__track-container']/div/div/div[1]"))

browser.wait(EC.visibilityOf(inf_curent_track), 10000, "Expected player controls to be visible in 10 seconds")