Подтвердить что ты не робот

Элемент Selenium Element не видно исключение

Мне поручено написать парсер, чтобы нажать кнопку на веб-сайте, и у меня возникают проблемы, чтобы щелкнуть только одну из кнопок. Следующий код работает на каждой кнопке, кроме одной.

Здесь html: http://pastebin.com/6dLF5ru8

здесь источник html: http://pastebin.com/XhsedGLb

код python:

 driver = webdriver.Firefox()  
 ...
 el = driver.find_element_by_id("-spel-nba")
 actions.move_to_element(el)
 actions.sleep(.1)
 actions.click()
 actions.perform()

Я получаю эту ошибку.

ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with

в соответствии с Saifur Я просто пытался ждать с тем же элементом, что и не видимое исключение:

wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.XPATH, "//input[contains(@id,'spsel')][@value='nba']"))).click()
4b9b3361

Ответ 1

Если вы посмотрите на источник страницы, вы поймете, что почти все элементы SELECT, DIV являются faked и созданы из JavaScript, поэтому webdriver не может SEE их.

В этом случае обходное решение, используя ActionChains, чтобы открыть консоль разработчика, и нарисуйте искусственный CLICK на нужном элементе, который на самом деле является Label вызывая загрузку NBA... здесь рабочий пример:

from selenium import webdriver
from selenium.webdriver.common import action_chains, keys
import time

driver = webdriver.Firefox()
driver.get('Your URL here...')
assert 'NBA' in driver.page_source
action = action_chains.ActionChains(driver)

# open up the developer console, mine on MAC, yours may be diff key combo
action.send_keys(keys.Keys.COMMAND+keys.Keys.ALT+'i')
action.perform()
time.sleep(3)
# this below ENTER is to rid of the above "i"
action.send_keys(keys.Keys.ENTER)
# inject the JavaScript...
action.send_keys("document.querySelectorAll('label.boxed')[1].click()"+keys.Keys.ENTER)
action.perform()

Альтернативно, чтобы заменить все команды ActionChains, вы можете просто запустить execute_script следующим образом:

driver.execute_script("document.querySelectorAll('label.boxed')[1].click()")

Там вы, по крайней мере, на моем локальном файле... Надеюсь, это поможет!

enter image description here

Ответ 2

Что сработало для меня, так это найти элемент непосредственно перед проблемным (то есть непосредственно перед ним с точки зрения порядка вкладок), а затем вызвать вкладку в этом элементе.

from selenium.webdriver.common.keys import Keys
elem = br.find_element_by_name("username")
elem.send_keys(Keys.TAB) # tab over to not-visible element

После этого я смог отправить действия элементу.

Ответ 3

Я предлагаю вам использовать xpath с explicit wait

//input[contains(@id,'spsel')][@value='nba']

Ответ 4

Фактическое решение этой темы не сработало для меня.

однако,

это сделало:

element  = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.XPATH, xpaths['your_xpath_path'])))

трюк заключается в использовании:

EC.visibility_of_element_located

WebDriverWait

WebDriverWait

из этого импорта:

from selenium.webdriver.support import expected_conditions как EC

из selenium.webdriver.support.ui import WebDriverWait

Ответ 5

если "Элемент в настоящее время не виден", сделайте его ВИДИМЫМ

f.e.

>>> before is hidden top is outside of page
<input type="file" style="position: absolute;top:-999999" name="file_u">


>>> after move top on in page area
DRIVER.execute_script("document.getElementByName('file_u').style.top = 0;")
time.sleep(1); # give some time to render
DRIVER.find_element_by_name("file_u").send_keys("/tmp/img.png")

Ответ 6

Вместо get_element_by_id() вы можете попробовать elem = browser.find_element_by_css_selector('#elemId') (перейдите на эту веб-страницу и элемент, щелкните правой кнопкой мыши и Copy CSS Selector, или что-то в этом роде.) Это то, что я сделал, и он работает. Вы также можете попробовать find_element_by_link_text(text), find_element_by_partial_link_text(text), find_element_by_tag_name(tagName_case_insensitive_here), find_element_by_name(name) и т.д. Что-то будет работать. После id ваш лучший выбор - CSS Selector.

Ответ 7

В итоге я использовал решение @twasbrillig, но вместо того, чтобы найти предыдущий элемент и отправить нажатие клавиши TAB, я нахожу нужный элемент, отправляю нажатие клавиши TAB с этим элементом, а затем нажатие клавиши SHIFT + TAB на драйвер:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()  
el = driver.find_element_by_id("-spel-nba")
el.send_keys(Keys.TAB)
webdriver.ActionChains(driver).key_down(Keys.SHIFT).send_keys(Keys.TAB).key_up(Keys.SHIFT)

Ответ 8

Я попытался использовать другие методы, но в итоге обнаружил, что самый простой способ - просто попытаться нажать кнопку и поймать ошибку. Это позволяет мне выполнять другие действия в зависимости от того, сработало ли (True) или нет (False).

def click_button(html_object):
 try:
  html_object.click()
 except:
  return False #most likely because it is NotVisible object and can be ignored
 return True

...
...
click_button(actions)

Ответ 9

Я решил это в python:

try:
    # the element you want to scroll to
    element = driver.find_element_by_id("some_id") 
    ActionChains(driver).move_to_element(element).perform()
    element.send_keys(Keys.TAB).key_up(Keys.SHIFT)
    #element.click()
except Exception as e:
    print(e)