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

Найти ссылку на html странице


(login11) #1

Пытаюсь изучать python+selenium (python 2.7, selenium 2), тестирую портал. HTML код тестируюемой страницы
<div class="new_position">
<a class="headerNav hnAdm" href="/admin.html">Конфигурация</a>
</div>
Нужно в тесте перейти по ссылке Конфигурация, пытаюсь найти нужную ссылку
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://***.ru")
link=driver.find_element_by_link_text("Конфигурация")
выходит ошибка
Traceback (most recent call last):
File "C:\Python27\firefox", line 11, in <module>
link = driver.find_element_by_link_text('Конфигурация')
File "C:\Python27\lib\site-packages\selenium-2.31.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 241, in find_element_by_link_text
return self.find_element(by=By.LINK_TEXT, value=link_text)
File "C:\Python27\lib\site-packages\selenium-2.31.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 675, in find_element
{'using': by, 'value': value})['value']
File "C:\Python27\lib\site-packages\selenium-2.31.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 158, in execute
response = self.command_executor.execute(driver_command, params)
File "C:\Python27\lib\site-packages\selenium-2.31.0-py2.7.egg\selenium\webdriver\remote\remote_connection.py", line 337, in execute
data = utils.dump_json(params)
File "C:\Python27\lib\site-packages\selenium-2.31.0-py2.7.egg\selenium\webdriver\remote\utils.py", line 37, in dump_json
return json.dumps(json_struct)
File "C:\Python27\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Python27\lib\json\encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python27\lib\json\encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xca in position 0: invalid continuation byte

Не могу понять в чем проблема...?


(Artur Korobeynyk) #2

Связано с тем что интерпретатор не может обработать входной текст (страницу, с которой вы работаете), так как он не поддерживает кодировку UTF-8. Попробуйте в заголовок добавить

# -*- coding: cp1252 -*-

или

# -*- coding: iso-8859-15 -*-

Помогло бы кодирование в cp1251 и затем декодирование в utf8, но это надо загруженную страницу в селениуме перекодировать, думаю это можно сделать. Я с селениумом мало работал, так что не подскажу как это сделать, но что-то вроде driver.__page.encode("cp1252").decode("utf-8")

Может есть на форуме те, кто подскажут больше


(login11) #3

Установил python 3.3, импортировал библиотеку selenium. Повторил тест

Код Python
1
2
3
4
 # -*- coding: utf-8 -*-
driver=webdriver.Firefox()
driver.get("http://***.ru")
link=driver.find_element_by_link_text(u"Конфигурация")

Сообщение
Traceback (most recent call last):
File "C:/Python33/probka.py", line 12, in <module>
link = driver.find_element_by_link_text(u'Конфигурация')
File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py" , line 241, in find_element_by_link_text
return self.find_element(by=By.LINK_TEXT, value=link_text)
File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py" , line 675, in find_element
{'using': by, 'value': value})['value']
File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py" , line 160, in execute
self.error_handler.check_response(response)
File "C:\Python33\lib\selenium\webdriver\remote\errorhandler. py", line 149, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: 'Unable to locate element: {"method":"link text","selector":"Конфигурация"}' ; Stacktrace: Method FirefoxDriver.prototype.findElementInternal_ threw an error in file:///c:/users/user/appdata/local/temp/tmpe57orp/extensions/fxdriver@googlecode.com/components/driver_component.js
Если изменить

Код Python
1
2
3
4
5
 # -*- coding: utf-8 -*-
from __future__ import unicode_literals
driver=webdriver.Firefox()
driver.get("http://***.ru")
link=driver.find_element_by_link_text("Конфигурация")

Сообщение
Traceback (most recent call last):
File "C:/Python33/probka.py", line 13, in <module>
link = driver.find_element_by_link_text('Конфигурация')
File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py" , line 241, in find_element_by_link_text
return self.find_element(by=By.LINK_TEXT, value=link_text)
File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py" , line 675, in find_element
{'using': by, 'value': value})['value']
File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py" , line 160, in execute
self.error_handler.check_response(response)
File "C:\Python33\lib\selenium\webdriver\remote\errorhandler. py", line 149, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: 'Unable to locate element: {"method":"link text","selector":"Конфигурация"}' ; Stacktrace: Method FirefoxDriver.prototype.findElementInternal_ threw an error in file:///c:/users/user/appdata/local/temp/tmpbb121u/extensions/fxdriver@googlecode.com/components/driver_component.js


(taras_t) #4

і в першому і в другому випадку та сама проблема:

NoSuchElementException: Message: 'Unable to locate element: {"method":"link text","selector":"Конфигурация"}'

- драйвер не бачить елемента. Спробуй знайти його іншим способом (find_element_by_xpath('//a[@class="headerNav hnAdm"])), або по відношенню до інших елементів на сторінці (парент, чайлд...)


(login11) #5
Часть кода html
<div class="new_position">
<a class="headerNav hnAdm" href="/admin.html">Конфигурация</a>
<a class="headerNav hnEp" href="/admin.html#ws-nc=Справочники=Сотрудники;РеестрСотрудников={}&menuItem=ЭлектронныеПодписи">Электронные подписи</a>
</div>

Если искать ссылку Крнфигурация по find_element_by_xpath("//a[@class='headerNav hnAdm']")

элемент не найден

Traceback (most recent call last):
  File "C:\Python33\firefox", line 19, in <module>
    driver.find_element_by_xpath("//a[@class='headerNav hnAdm']")
  File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py", line 217, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py", line 675, in find_element
    {'using': by, 'value': value})['value']
  File "C:\Python33\lib\selenium\webdriver\remote\webdriver.py", line 160, in execute
    self.error_handler.check_response(response)
  File "C:\Python33\lib\selenium\webdriver\remote\errorhandler.py", line 149, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: 'Unable to locate element: {"method":"xpath","selector":"//a[@class=\'headerNav hnAdm\']"}' ; Stacktrace: Method FirefoxDriver.prototype.findElementInternal_ threw an error in file:///c:/users/user/appdata/local/temp/tmp3bmeif/extensions/fxdriver@googlecode.com/components/driver_component.js

Можно найти этот элемент иным способом driver.find_element_by_css_selector(), может кто-то подскажет


(Artur Korobeynyk) #6

Пробовал по link_text искать, но только с шапкой кодов 1252 ?

 

# -*- coding: cp1252 -*-

(taras_t) #7

ХТМЛ код  в студію!

Так всліпу тяжко сказати де проблема... Може використовуються iframe, тоді на них треба спершу перемикнутись.

А взагалі, хороша практика перед тим як писати свій код - проганяти локатори в FirePath (плагін для ФаєрБага)

https://addons.mozilla.org/en-US/firefox/addon/firepath/


(Mykhailo Poliarush) #8

проблема в поиске нужного элемента, нужно посмортреть весь html код целиком