Элемент 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()
Ответы
Ответ 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)