2015-07-14 9 views
3

Я использую Selenium для сохранения веб-страницы. Содержимое веб-страницы будет изменяться после нажатия определенных флажков. Я хочу, чтобы щелкнуть флажок, а затем сохранить содержимое страницы. (Флажки управляются JavaScript.)Python and Selenium Чтобы «execute_script» решить «ElementNotVisibleException»

Во-первых, я использовал:

driver.find_element_by_name("keywords_here").click() 

заканчивается с ошибкой:

NoSuchElementException 

тогда я попробовал «XPath», как, с неявной/Явный ожидания :

URL = “the url” 

verificationErrors = [] 
accept_next_alert = True 

aaa = driver.get(URL) 
driver.maximize_window() 
WebDriverWait(driver, 10) 

#driver.find_element_by_xpath(".//*[contains(text(), ' keywords_here')]").click() 
#Or: 

driver.find_element_by_xpath("//label[contains(text(),' keywords_here')]/../input[@type='checkbox']").click() 

он дает ошибку:

ElementNotVisibleException 

Сообщений

How to force Selenium WebDriver to click on element which is not currently visible?

Selenium Element not visible exception

предполагают, что это должно сделать флажками видимым перед нажатием кнопки, например, с помощью:

execute_script 

Вопрос может звучит глупо, но как может Я обнаружил, что правильное предложение для «execute_script» - видимость checkbo x из исходного кода страницы?

Кроме того, есть ли другой способ?

Спасибо.

, кстати, строка HTML код выглядит следующим образом:

<input type="checkbox" onclick="ComponentArt_HandleCheck(this,'p3',11);" name="keywords_here"> 

его XPath выглядит следующим образом:

//*[@id="TreeView1_item_11"]/tbody/tr/td[3]/input 

ответ

5

Альтернативный вариант должен был бы сделать click() внутри execute_script():

# wait for element to become present 
wait = WebDriverWait(driver, 10) 
checkbox = wait.until(EC.presence_of_element_located((By.NAME, "keywords_here"))) 

driver.execute_script("arguments[0].click();", checkbox) 

где EC является импорт ред как:

from selenium.webdriver.support import expected_conditions as EC 

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

wait = WebDriverWait(driver, 10) 
checkbox = wait.until(EC.element_to_be_clickable((By.NAME, "keywords_here"))) 

checkbox.click() 
+0

Сэр alecxe, спасибо за помощь. Вы эксперт. Я прочитал некоторые из ваших сообщений. Я пробовал строки, но оба они дают «raise TimeoutException (message)» «selenium.common.exceptions.TimeoutException: Message: ''. –

+0

@MarkK спасибо. Но в то же время 'driver.find_element_by_xpath (" // label [contains (contains (text(), 'keywords_here')] /../ input [@ type = 'checkbox'] ")' не вызывает ошибку? Вы проверили, что xpath, который вы используете внутри 'find_element_by_xpath', используется так же, как и в« Ожидаемых условиях », которые я опубликовал? Благодарю. – alecxe

+0

(извините, что есть ошибка - я заменил вас на то, что у меня было, но на самом деле я думаю, что ваши строки должны быть добавлены после исходных строк.) Я добавил ваши строки в оригиналы, а xpaths в них одинаковы. driver.find_element_by_xpath ("// label [contains (text(), 'keywords_here')] /../ input [@ type = 'checkbox']") сам дает «NoSuchElementException». –

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