terpyakov
(Alexander Terpyakov)
November 13, 2013, 8:30am
#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">
polusok
(Mykhailo Poliarush)
November 13, 2013, 8:38am
#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
1 Like
TIT
(Сергей Блохин)
November 13, 2013, 9:01am
#3
Поправьте код, без < > невозможно читать.
terpyakov
(Alexander Terpyakov)
November 13, 2013, 11:36am
#5
Переключение в iframe не решает проблему, т.к. он опоясывает второй html, а не находится в нем и доступ ко второму html все равно не получаем.
polusok
(Mykhailo Poliarush)
November 13, 2013, 12:15pm
#6
Есть страница на которую можно посмотреть?
terpyakov
(Alexander Terpyakov)
November 13, 2013, 12:31pm
#7
TIT
(Сергей Блохин)
November 13, 2013, 3:33pm
#8
А дальше? Дай ссылку или список ссылок по котороым можно выйти на страницу с тем iFrame?
terpyakov
(Alexander Terpyakov)
November 14, 2013, 12:51am
#9
Погнали
https://dev.flurry.com
после залогинивания станет
https://dev.flurry.com/home.do
потом надо нажать на Advertisers,
но лучше прямая ссыль
Flurry Analytics - вот она с iframe ом
надо нажать Seleniumом на NewCanpaign
TIT
(Сергей Блохин)
November 14, 2013, 5:47am
#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()
1 Like
joemast
(Александр Таранков)
November 14, 2013, 7:00am
#11
Мне интересно как происходит переключение во фрейм по элементу? Ведь изначально поиск по xpath производится в основном документе. Никогда таким способом не пользовался, интересно как это работает
polusok
(Mykhailo Poliarush)
November 14, 2013, 7:49am
#12
Да очень просто происходит, ведь iframe принадлежит в вышестоящему html, т.е. мы сначала находим iframe и потом уже в нем ищем. Тут просто есть несколько способов задания переходов в iframe или по имени или по индексу или по найденному вебелементу, но в итоге действие одно и тоже нахождение в DOM iframe и переключение на него.
1 Like
TIT
(Сергей Блохин)
November 14, 2013, 7:55am
#13
Чтобы не засорять тему — написал небольшой пост по работе с iFrame в Базе знаний .
1 Like
TIT
(Сергей Блохин)
November 15, 2013, 5:46am
#14
@terpyakov , ну как? Получилось решить проблему?
terpyakov
(Alexander Terpyakov)
November 15, 2013, 6:50am
#15
Да) это решение, спасибо)
Напишите, плз, как вернуться, т.е. сделать свич на основной html
TIT
(Сергей Блохин)
November 15, 2013, 7:14am
#16
# ruby
driver.switch_to.default_content
# python
driver.switch_to_default_content()
1 Like
terpyakov
(Alexander Terpyakov)
November 15, 2013, 10:13am
#17
А у меня
AttributeError: ‘WebDriver’ object has no attribute ‘switchTo’
что нужно доимпортировать?
polusok
(Mykhailo Poliarush)
November 15, 2013, 10:19am
#18
Тут уже надо, чтобы ты показал свой код. Ты где-то не там вызываешь нужный метод.
TIT
(Сергей Блохин)
November 15, 2013, 10:47am
#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()
В любом случае рекоменду почитать документацию .
terpyakov
(Alexander Terpyakov)
November 16, 2013, 11:44am
#20
спасибо) ботаю документацию, да)
проблема решена.