Nano Hash - криптовалюты, майнинг, программирование

поиск текста элемента или источника текущей страницы

Я делаю следующее в selenium 2/webdrive, используя python и firefox...

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

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

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

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

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

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

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

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

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

Вот код:

    #!/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'

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

введите здесь описание изображения

Еще один вариант, который я думал об использовании, заключался в том, чтобы получить источник страницы из веб-драйвера и выполнить поиск, чтобы увидеть, был ли там тег, но, по-видимому, нет простого способа сделать ЭТО в веб-драйвере!

28.01.2012

  • Это для целей тестирования? Есть ли причина избегать модулей тестирования Python, таких как pytest или unittest? У меня была аналогичная ситуация, и селен не запускал все тестовые случаи, если они все не прошли. С pytest я мог бы сделать это. Кроме того, есть и другие преимущества. 28.01.2012
  • На самом деле нет - он не для тестирования. Я использую Webdriver, чтобы пересматривать все мои написанные на заказ веб-скраперы, которые продолжают ломаться, потому что веб-сайт постоянно меняет HTML... иногда я думаю, что они делают это только для того, чтобы достать меня. Webdriver должно быть проще поддерживать в актуальном состоянии, поскольку он более модульный по своей природе, и мне не нужно пробираться через столько кода, чтобы найти проблему. Кроме того, один из моих клиентов не может подключить свою сеть к Интернету с помощью механизированного кода, который я использую. Надеюсь, она сможет использовать эту версию. 15.02.2012

Ответы:


1

Если вы не знаете, какое исключение ожидать, используйте пустые 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:
    #...

ОБНОВИТЬ:

Вы просто получаете исключение перед 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']");
28.01.2012
  • Трассировка дала мне тот же результат. Добавление импорта дало мне новую ошибку: нет исключений с именем модуля... 28.01.2012

  • 2

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

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

        #!/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'
    

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

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

    28.01.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..