ищет текст элемента или источника текущей страницы - PullRequest
0 голосов
/ 28 января 2012

Я делаю следующее в Selen 2 / WebDrive, используя Python и Firefox ...

Я открываю некоторые веб-страницы, которые мне нужно проверить на наличие конкретной строки - что, если присутствует, означает, что этохорошая страница для разбора.

Фраза, которую я ищу, это элемент h2, подобный следующему:

<h2 class="page_title">Worlds Of Fantasy : Medieval House</h2>

Если этот h2 отсутствует, я знаю, что мне не нужно работатьна нем просто вернитесь и получите следующий в строке.

В коде у меня есть блок try / exception / else, который ищет фразу, если он видит ее, он переходит к следующей части функции,Если нет, он должен перейти к else, что говорит о необходимости возврата.

В этом тесте вызываются 2 страницы - первая содержит фразу, вторая нет.

Первая страница открывается и проходит тест.

Вторая страница открывается, и я получаю отчет об исключении - но он никогда не возвращается к вызывающему коду в main ... itпросто останавливается.

Почему исключение не соответствует правильному пути возврата?

Вот код:

    #!/usr/bin/env python

from selenium import webdriver
from selenium.webdriver import Firefox as Browser
from selenium.webdriver.support.ui import WebDriverWait


browser = webdriver.Firefox()

def call_productpage(productlink):
    global browser

    print 'in call_productpage(' + productlink + ')'
    browser.get(productlink)
    browser.implicitly_wait(8)

    #start block with <div class="page_content"> 
    product_block = browser.find_element_by_xpath("//div[@class='page_content']");

    # <h2 class="page_title">Worlds Of Fantasy : Medieval House</h2>
    try:
        product_name = product_block.find_element_by_xpath("//h2[@class='page_title']");
    except Exception, err:
        #print "Failed!\nError (%s): %s" % (err.__class__.__name__, err)
        print 'return to main()'
        return 0
    else:
        nameStr = str(product_name.text)
        print 'product_name:' + nameStr
    finally:
        print "test over!"
        return 1

test1 = call_productpage('https://www.daz3d.com/i/3d-models/-/desk-clocks?spmeta=ov&item=12657')
if test1:
    print '\ntest 1 went OK\n'
else:
    print '\ntest 1 did NOT go OK\n'

tes2 = call_productpage('https://www.daz3d.com/i/3d-models/-/dierdre-character-pack?spmeta=ov&item=397')
if test2:
    print '\ntest 2 went OK\n'
else:
    print '\ntest 2 did NOT go OK\n'

А вот скриншот консолипоказывая исключение, которое я получаю:

enter image description here

Еще один вариант, который я подумал об использовании, - получить исходный код страницы от веб-драйвера и найти, чтобы увидеть, был ли тег там.- но, видимо, в webdriver нет простого способа сделать это!

Ответы [ 2 ]

0 голосов
/ 29 января 2012

Это решение! Спасибо!

Вот окончательный код, немного очищенный, чтобы сделать результат более читабельным:

    #!/usr/bin/env python

from selenium import webdriver
from selenium.webdriver import Firefox as Browser
from selenium.webdriver.support.ui import WebDriverWait

browser = webdriver.Firefox()

def call_productpage(productlink):
    global browser

    print 'in call_productpage(' + productlink + ')'
    browser.get(productlink)
    browser.implicitly_wait(1)
    product_block = ''
    try:
        product_block = browser.find_element_by_xpath("//div[@class='page_content']");
    except:
        print 'this is NOT a good page - drop it'
        return 0
    else:
        textStr = str(product_block.text)
        #print 'page_content:' + str(textStr)
        print '\nthis is a good page - proceed\n'

    print 'made it past the exception!\n'

    product_name = product_block.find_element_by_xpath("//h2[@class='page_title']");
    nameStr = str(product_name.text)
    print '>>> product_name:' + nameStr + '\n'
    print "test over!"
    return 1

test1 = call_productpage('https://www.daz3d.com/i/3d-models/-/desk-clocks?spmeta=ov&item=12657')
print '\nTest #1:\n============\n'
if test1:
    print '\ntest 1 returned true\n'
else:
    print '\ntest 1 returned false\n'

print '\nTest #2:\n============\n'
test2 = call_productpage('https://www.daz3d.com/i/3d-models/-/dierdre-character-pack?spmeta=ov&item=397')
if test2:
    print '\ntest 2 returned true\n'
else:
    print '\ntest 2 returned false\n'
print '\n============\n'

И это работает так, как мне нужно.

Еще раз спасибо.

0 голосов
/ 28 января 2012

Если вы не знаете, какое исключение ожидать, используйте пустые except и traceback:

import traceback

try:
    int('string')
except:
    traceback.print_exc()
    print "returning 0"

# will print out an exception and execute everything in the 'except' clause:
# Traceback (most recent call last):
#   File "<stdin>", line 2, in <module>
# ValueError: invalid literal for int() with base 10: 'string'
# returning 0

Но из трассировки стека вы уже знаете точное имя исключения, поэтому используйте его вместо:

from selenium.webdriver.exceptions import NoSuchElementException

try:
    #...
except NoSuchElementException, err:
    #...

UPDATE:

Вы просто получаете исключение до try ... except, здесь:

product_block = browser.find_element_by_xpath("//div[@class='page_content']");

а не здесь:

product_name = product_block.find_element_by_xpath("//h2[@class='page_title']");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...