在对我的主页进行Selenium测试时,我遇到了以下问题:
页面上有许多按钮。当单击其中一个选项时,一个选择列表将通过javascript函数填充许多选项。单击其中一个按钮后,选择列表看起来像这样:
<select id="selectionList" name="List1" size="10" style="width:100%;">
<option style="color:#0275d8">Item Type 1</option>
<option onclick="onSelection()" id="Item_1">Item 1</option>
<option onclick="onSelection()" id="Item_2">Item 2</option>
<option onclick="onSelection()" id="Item_3">Item 3</option>
<option onclick="onSelection()" id="Item_4">Item 4</option>
<option onclick="onSelection()" id="Item_5">Item 5</option>
<option onclick="onSelection()" id="Item_6">Item 6</option>
<option style="color:#0275d8">Item Type 2</option>
<option onclick="onSelection()" id="Item_7">Item 7</option>
<option onclick="onSelection()" id="Item_8">Item 8</option>
<option onclick="onSelection()" id="Item_9">Item 9</option>
<option onclick="onSelection()" id="Item_10">Item 10</option>
</select>
在我的测试中,我使用下面的代码来点击其中一个项目。
WebDriverWait(self.browser, 60).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='Item_1']"))).click()
我确实看到项目1被突出显示,但onSelection()函数没有被调用。
我也试过这个
time.sleep(10)
self.browser.find_element_by_id("Item_1").click()
项目1再次被突出显示,但函数onSelection()没有被调用。
你知道怎么解决这个问题吗?
这似乎是一个已知的问题
https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/2556
问题被标记为已关闭,但似乎只是因为原始报告者放弃了该问题和/或因为它是从较旧的问题跟踪器中报告的导入错误。
在讨论中有一个报告的解决方法
driver.action.click_and_hold(element).perform
sleep(1)
driver.action.release.perform
我认为代码是非正式的,因为AFAIK没有driver.action
。而你必须做actions = ActionChains(driver)
。
查看更多信息:https://www.tutorialspoint.com/what-are-actionchains-class-in-selenium-with-python
该元素是一个html-select元素,所以你需要使用Select()
类。
选择文本为项目1的<option>
使用Selenium,您需要为element_to_be_clickable()
诱导WebDriverWait,您可以使用以下定位器策略之一:
-
Using
CSS_SELECTOR
:select = Select(WebDriverWait(self.browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select#selectionList[name='List1']")))) select.select_by_visible_text('Item 1')
-
Using
XPATH
:select = Select(WebDriverWait(self.browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@id='selectionList' and @name='List1']")))) select.select_by_visible_text('Item 1')
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
引用
你可以在下面找到一些相关的讨论:
- 如何使用Selenium和Python从下拉菜单中选择一个选项