2016-05-12 2 views
0

У меня проблема с phantomjs selenium python, которую я не мог решить. element.location возвращает неправильное местоположение. когда я вижу обрезанное изображение, он отображает часть желаемого изображения, а также нежелательную. Он отлично работал на firefox, но не работает на phantomjs.python selenium phantomJS element.location возвращает неправильное местоположение

Вот код:

def screenOfElement(self, _element): 
    _location = _element.location 
    _size = _element.size 
    _wholePage = Image.open(StringIO.StringIO(base64.decodestring(self.webdriver.get_screenshot_as_base64()))) 

    _left = _location['x'] 
    _top = _location['y'] 
    _right = _location['x'] + _size['width'] 
    _bottom = _location['y'] + _size['height'] 

    return _wholePage.crop((_left, _top, _right, _bottom)) 

Спасибо.

ответ

0

Я нашел только одно решение, которое сработало.

Метод 1:

1) Скрыть все, кроме необходимого элемента:

with open('jquery-2.2.3.min.js', 'r') as jquery_js: 
    jquery = jquery_js.read() #read the jquery from a file 
    self.webdriver.execute_script(jquery) #active the jquery lib 
    self.webdriver.execute_script(""" 
     element = $('#mydiv').parent(); 
     while(element.parent().length) 
     { 
      element.parent().siblings().hide(); 
      element = element.parent(); 
     } 
    """) 

2) Сделать снимок.

3) Показать все элементы, которые мы спрятали:

self.webdriver.execute_script(""" 
    element = $('#mydiv').parent(); 
    while(element.parent().length) 
    { 
     element.parent().siblings().show(); 
     element = element.parent(); 
    } 
""") 

Но вопрос с, что, после того, как мы покажем все элементы, мы могли бы показать те, которые были скрыты раньше. Также иногда это не работает.

Если вы используете phantomJS, возможно, визуальные части не имеют значения. Таким образом, лучшим решением было бы, чтобы

Способ 2:

1) Поместите необходимый элемент непосредственно внутри <body>:

$('body').append($('#mydiv')) 

2) Скрыть все элементы, за исключением необходимого одного:

$('body > :not("#mydiv")').hide(); 

3) Показать еще:

$('body > *)').show(); 

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

Смежные вопросы