Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Доступ к элементам во вложенных html


(Alexander Terpyakov) #1

Два вложенных html по первому ищет, по второму - нет. Как обратиться к баттону newButton
WebDriver + python

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>
<body id="body" class="yui-skin-sam hasFlash" onload="setupHeights()">
<div id="container">
<div id="header">
<div id="main" style="height: 481px;">
<div id="leftColumn" style="position: absolute; top: 0px; height: 481px;">
<div id="centerColumn" class="analyticsSection" style="margin-left: 265px; margin-right: 35px; height: 481px;">
<div class="mainAreaContainer relative">
<div class="relative">
<iframe id="brandCampaignList" class="iFrameWithMinWidth" src="/html/campaign_list.html" style="border: 0px none; display: inline; height: 479px;">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<body data-twttr-rendered="true" style="">
<div id="heading" style="margin: 0;">
<h1 class="inline">AppCircle Display and Video Campaigns</h1>
<button id="newButton" class="btn btn-inverse">

(Mykhailo Poliarush) #2

У вас тут iframe а значит перед тем как выполнять действия “во втором html”, а т.е. в фрейме, вам надо на него переключиться. Пример:

driver.switch_to_frame('frame_name') 
driver.switch_to_frame(1) 

и уже дальше выполнять свои действия

описание команды можно найти тут http://selenium-python.readthedocs.org/en/latest/api.html#selenium.webdriver.remote.webdriver.WebDriver.switch_to_frame


(Сергей Блохин) #3

Поправьте код, без < > невозможно читать.


(Mykhailo Poliarush) #4

поправил


(Alexander Terpyakov) #5

Переключение в iframe не решает проблему, т.к. он опоясывает второй html, а не находится в нем и доступ ко второму html все равно не получаем.


(Mykhailo Poliarush) #6

Есть страница на которую можно посмотреть?


(Alexander Terpyakov) #7

зарегайтесь)
https://dev.flurry.com/secure/login.do


(Сергей Блохин) #8

А дальше? Дай ссылку или список ссылок по котороым можно выйти на страницу с тем iFrame?


(Alexander Terpyakov) #9

Погнали :slight_smile:
https://dev.flurry.com

после залогинивания станет
https://dev.flurry.com/home.do

потом надо нажать на Advertisers,
но лучше прямая ссыль
https://dev.flurry.com/appCircleAcquisitionCampaigns.do - вот она с iframe ом

надо нажать Seleniumом на NewCanpaign


(Сергей Блохин) #10

Держи.

Ruby

# encoding: utf-8

require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome

driver.get 'https://dev.flurry.com/appCircleAdvertisersIntroduction.do'

element = driver.find_element :xpath, '//*[@id="emailInput"]'
element.send_keys '%email%'

element = driver.find_element :xpath, '//*[@id="passwordInput"]'
element.send_keys '%password%'

element = driver.find_element :xpath, '//*[@id="loginActionForm"]/div[5]/button/span'
element.click

element = driver.find_element :xpath, '//*[@id="advertiserIntroduction"]'
driver.switch_to.frame element

element = driver.find_element :xpath, '//*[@id="advertise"]/section[2]/article[2]/header/a'
element.click

element = driver.find_element :xpath, '//*[@id="advertise"]/section[2]/div/div'
puts element.text

driver.close

Python

# -*- coding: utf-8 -*-

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://dev.flurry.com/appCircleAdvertisersIntroduction.do')

element = driver.find_element_by_xpath('//*[@id="emailInput"]')
element.send_keys('%email%')

element = driver.find_element_by_xpath('//*[@id="passwordInput"]')
element.send_keys('%password%')

element = driver.find_element_by_xpath('//*[@id="loginActionForm"]/div[5]/button/span')
element.click()

element = driver.find_element_by_xpath('//*[@id="advertiserIntroduction"]')
driver.switch_to_frame(element)

element = driver.find_element_by_xpath('//*[@id="advertise"]/section[2]/article[2]/header/a')
element.click()

element = driver.find_element_by_xpath('//*[@id="advertise"]/section[2]/div/div')
print element.text

driver.close()

(Александр Таранков) #11

Мне интересно как происходит переключение во фрейм по элементу? Ведь изначально поиск по xpath производится в основном документе. Никогда таким способом не пользовался, интересно как это работает


(Mykhailo Poliarush) #12

Да очень просто происходит, ведь iframe принадлежит в вышестоящему html, т.е. мы сначала находим iframe и потом уже в нем ищем. Тут просто есть несколько способов задания переходов в iframe или по имени или по индексу или по найденному вебелементу, но в итоге действие одно и тоже нахождение в DOM iframe и переключение на него.


(Сергей Блохин) #13

Чтобы не засорять тему — написал небольшой пост по работе с iFrame в Базе знаний.


(Сергей Блохин) #14

@terpyakov, ну как? Получилось решить проблему?


(Alexander Terpyakov) #15

Да) это решение, спасибо)
Напишите, плз, как вернуться, т.е. сделать свич на основной html


(Сергей Блохин) #16
# ruby
driver.switch_to.default_content
# python
driver.switch_to_default_content()

(Alexander Terpyakov) #17

А у меня

AttributeError: ‘WebDriver’ object has no attribute ‘switchTo’
что нужно доимпортировать?


(Mykhailo Poliarush) #18

Тут уже надо, чтобы ты показал свой код. Ты где-то не там вызываешь нужный метод.


(Сергей Блохин) #19

Мои извинения чёртов python.
driver.switch_to_default_content() правильно.

# -*- coding: utf-8 -*-

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://dev.flurry.com/appCircleAdvertisersIntroduction.do')

element = driver.find_element_by_xpath('//*[@id="emailInput"]')
element.send_keys('%email%')

element = driver.find_element_by_xpath('//*[@id="passwordInput"]')
element.send_keys('%password%')

element = driver.find_element_by_xpath('//*[@id="loginActionForm"]/div[5]/button/span')
element.click()

element = driver.find_element_by_xpath('//*[@id="advertiserIntroduction"]')
driver.switch_to_frame(element)

element = driver.find_element_by_xpath('//*[@id="advertise"]/section[2]/article[2]/header/a')
element.click()

element = driver.find_element_by_xpath('//*[@id="advertise"]/section[2]/div/div')

# You must accept the terms and conditions to continue
print element.text

driver.switch_to_default_content()

element = driver.find_element_by_xpath('//*[@id="header"]/div[1]/div[2]/a[2]/span')

# logout
print element.text

driver.close()

В любом случае рекоменду почитать документацию.


(Alexander Terpyakov) #20

спасибо) ботаю документацию, да)
проблема решена.