无法 select 下拉菜单中的选项 Python Selenium
Cannot select an option from drop down menu Python Selenium
我对 Python 比较陌生(好吧,相对而言)。我需要 select 从下拉菜单中选择一个选项。我已经尝试了几乎所有可用的解决方案。但似乎没有任何效果。
这是我正在与之交互的页面:http://www.europarl.europa.eu/plenary/en/debates-video.html?action=1&tabActif=tabResult#sidesForm
这是给我带来问题的页面源代码部分:
<select id="criteriaSidesLeg" name="leg" style="display:none;" aria-disabled="false">
<option title="2014 - 2019" value="8">2014 - 2019</option>
<option title="2009 - 2014" value="7" selected="selected">2009 - 2014</option>
<option title="2004 - 2009" value="6">2004 - 2009</option>
<option title="1999 - 2004" value="5">1999 - 2004</option>
</select>
目前我尝试过的是:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# pressing the botton year menu making the element visible
elem_year_arrow=driver.find_element_by_id("criteriaSidesLeg-button")
elem_year_arrow.click()
year= driver.find_element_by_id('criteriaSidesLeg')
for option in year.find_elements_by_tag_name('option'):
if option.text=='2009 - 2014':
option.click()
break
这给了我这个错误:
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible: Element is not currently visible and may not be manipulated
(Session info: chrome=54.0.2840.87)
(Driver info: chromedriver=2.25.426935 (820a95b0b81d33e42712f9198c215f703412e1a1),platform=Mac OS X 10.10.5 x86_64)
我也尝试过这个其他解决方案
wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.ID,"criteriaSidesLeg")))
select = Select(element)
select.select_by_value('7')
这不是给我错误,而是这个 TimeOutexception
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
所以我也尝试执行这个命令行:
driver.execute_script("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].value == arguments[1]){ select.options[i].selected = true; } }", element, "01")
但再次出现上述超时异常
如何进行 ?
我希望这个问题足够清楚,并提前谢谢大家!
您正在尝试处理错误的元素。试试这个代码,如有任何问题请告诉我:
driver.find_element_by_xpath('//a[@id="criteriaSidesLeg-button"]').click()
driver.find_element_by_xpath('//a[text()="2009 - 2014"]').click()
不使用也一样 XPath
:
driver.find_element_by_id('criteriaSidesLeg-button').click()
driver.find_element_by_link_text('2009 - 2014').click()
您链接到的站点的问题是 select 框仅由 JS 管理,并已被非 select 下拉菜单所取代。如果您想应用自定义用户体验,这很常见,而自定义用户体验并不总是适用于 OS-定义的 select 行为。
您可以让 Selenium 执行一些 Javascript,从 select 中删除 display:none
样式,然后执行您的选项 select.
driver.execute_script("document.getElementById('criteriaSidesLeg').setAttribute('style','')");
或者模拟对 psuedo-select 元素的必要点击,让站点 JS 为您更新 select。
我对 Python 比较陌生(好吧,相对而言)。我需要 select 从下拉菜单中选择一个选项。我已经尝试了几乎所有可用的解决方案。但似乎没有任何效果。 这是我正在与之交互的页面:http://www.europarl.europa.eu/plenary/en/debates-video.html?action=1&tabActif=tabResult#sidesForm 这是给我带来问题的页面源代码部分:
<select id="criteriaSidesLeg" name="leg" style="display:none;" aria-disabled="false">
<option title="2014 - 2019" value="8">2014 - 2019</option>
<option title="2009 - 2014" value="7" selected="selected">2009 - 2014</option>
<option title="2004 - 2009" value="6">2004 - 2009</option>
<option title="1999 - 2004" value="5">1999 - 2004</option>
</select>
目前我尝试过的是:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# pressing the botton year menu making the element visible
elem_year_arrow=driver.find_element_by_id("criteriaSidesLeg-button")
elem_year_arrow.click()
year= driver.find_element_by_id('criteriaSidesLeg')
for option in year.find_elements_by_tag_name('option'):
if option.text=='2009 - 2014':
option.click()
break
这给了我这个错误:
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible: Element is not currently visible and may not be manipulated
(Session info: chrome=54.0.2840.87)
(Driver info: chromedriver=2.25.426935 (820a95b0b81d33e42712f9198c215f703412e1a1),platform=Mac OS X 10.10.5 x86_64)
我也尝试过这个其他解决方案
wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.ID,"criteriaSidesLeg")))
select = Select(element)
select.select_by_value('7')
这不是给我错误,而是这个 TimeOutexception
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
所以我也尝试执行这个命令行:
driver.execute_script("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].value == arguments[1]){ select.options[i].selected = true; } }", element, "01")
但再次出现上述超时异常 如何进行 ? 我希望这个问题足够清楚,并提前谢谢大家!
您正在尝试处理错误的元素。试试这个代码,如有任何问题请告诉我:
driver.find_element_by_xpath('//a[@id="criteriaSidesLeg-button"]').click()
driver.find_element_by_xpath('//a[text()="2009 - 2014"]').click()
不使用也一样 XPath
:
driver.find_element_by_id('criteriaSidesLeg-button').click()
driver.find_element_by_link_text('2009 - 2014').click()
您链接到的站点的问题是 select 框仅由 JS 管理,并已被非 select 下拉菜单所取代。如果您想应用自定义用户体验,这很常见,而自定义用户体验并不总是适用于 OS-定义的 select 行为。
您可以让 Selenium 执行一些 Javascript,从 select 中删除 display:none
样式,然后执行您的选项 select.
driver.execute_script("document.getElementById('criteriaSidesLeg').setAttribute('style','')");
或者模拟对 psuedo-select 元素的必要点击,让站点 JS 为您更新 select。