如何使用来自具有特殊设置的网站的Selenium从下拉列表中选择值 - Python

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用来自具有特殊设置的网站的Selenium从下拉列表中选择值 - Python相关的知识,希望对你有一定的参考价值。

注意:我特别处理这个website

如何在Python中使用selenium来获取this page上的评论以按“最新”排序?

我试过的是:

driver.find_element_by_id('sort-order-dropdown').send_keys('Most recent') 

来自this没有造成任何错误,但没有奏效。

然后我试了一下

from selenium.webdriver.support.ui import Select

select = Select(driver.find_element_by_id('sort-order-dropdown'))
select.select_by_value('recent')
select.select_by_visible_text('Most recent')
select.select_by_index(1)

我有:Message: Element <select id="sort-order-dropdown" class="a-native-dropdown" name=""> is not clickable at point (66.18333435058594,843.7999877929688) because another element <span class="a-dropdown-prompt"> obscures it

这个

element = driver.find_element_by_id('sort-order-dropdown')
element.click()
li = driver.find_elements_by_css_selector('#sort-order-dropdown > option:nth-child(2)')
li.click()

来自this造成同样的错误消息

来自this的这个也导致了同样的错误

Select(driver.find_element_by_id('sort-order-dropdown')).select_by_value('recent').click()

所以,我很想知道是否有任何方法可以从最近的第一次选择评论。

谢谢

答案

这对我使用Java有用:

@Test
public void amazonTest() throws InterruptedException {
    String URL = "https://www.amazon.com/Harry-Potter-Slytherin-Wall-Banner/product-reviews/B01GVT5KR6/ref=cm_cr_dp_d_show_all_top?ie=UTF8&reviewerType=all_reviews";
    String menuSelector = ".a-dropdown-prompt";
    String menuItemSelector = ".a-dropdown-common .a-dropdown-item";

    driver.get(URL);

    Thread.sleep(2000);

    WebElement menu = driver.findElement(By.cssSelector(menuSelector));
    menu.click();

    List<WebElement> menuItem = driver.findElements(By.cssSelector(menuItemSelector));
    menuItem.get(1).click();
}

您可以重用元素名称并使用Python遵循类似的路径。

这里的关键点是:

  1. 单击菜单本身
  2. 单击第二个菜单项

更好的做法是不对项目编号进行硬编码,而是实际读取项目名称并选择正确的名称,以便即使菜单更改也能正常工作。这只是未来改进的一个注意事项。

编辑这是如何在Python中完成相同的操作。

import time

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

URL = "https://www.amazon.com/Harry-Potter-Slytherin-Wall-Banner/product-reviews/B01GVT5KR6/ref=cm_cr_dp_d_show_all_top?ie=UTF8&reviewerType=all_reviews";
menuSelector = ".a-dropdown-prompt";
menuItemSelector = ".a-dropdown-common .a-dropdown-item";

driver = webdriver.Chrome()
driver.get(URL)

elem = driver.find_element_by_css_selector(menuSelector)
elem.click()

time.sleep(1)
elemItems = []
elemItems = driver.find_elements_by_css_selector(menuItemSelector)
elemItems[1].click()

time.sleep(5)
driver.close()

请记住,css选择器是xpath的更好替代品,因为它们更快,更强大,更易于阅读和更改。

另一答案

这是我为了从最新的评论中排序的评论所做的简化版本。正如上面所说的“Eugene S”,关键点是单击按钮本身并从列表中选择/单击所需的项目。但是,我的Python代码使用XPath而不是选择器。

# click on "Top rated" button
driver.find_element_by_xpath('//*[@id="a-autoid-4-announce"]').click() 
# this one select the "Most recent"
driver.find_element_by_xpath('//*[@id="sort-order-dropdown_1"]').click() 

以上是关于如何使用来自具有特殊设置的网站的Selenium从下拉列表中选择值 - Python的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中使用 selenium 从动态网站获取数据:如何发现数据库查询的完成方式?

如何使用 Python 和 Selenium 在 Chrome 中打开具有不同 URL 的新标签页? [复制]

如何从动态网站python selenium中检索表

如何使用 phpMyAdmin 中的 SQL 查询设置具有许多特殊字符的列值?

如何在 selenium 中更快地从动态网站读取数据

如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]