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