【问题标题】:Python Selenium Get Data From Two Combo BoxesPython Selenium 从两个组合框中获取数据
【发布时间】:2019-03-12 21:30:01
【问题描述】:

我有两个组合框,我需要从中获取数据。我们称他们为“制造商”和“模型”

当您从一个框中选择制造商时,另一个框会填充该制造商生产的模型。这可以手动工作,但是当我使用 Selenium 以编程方式选择制造商时,“模型”框不会重新填充。这是代码。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
driver = webdriver.Firefox()
#Base URL
driver.get("https://example.com/")
def scrape():    
    #get manufacturer list
    select1 = driver.find_element_by_name("mnfr")
    makes = [x.text for x in select1.find_elements_by_tag_name("option")]
    print(makes)
    #get models list
    for m in makes:
        select1a = Select(driver.find_element_by_name("makeCodeListPlaceHolder"))           
        select1a.select_by_visible_text(m)        
        select2 = driver.find_element_by_name("models")
        models = [x.text for x in select2.find_elements_by_tag_name("option")]
        print(models)
scrape()

【问题讨论】:

  • 不看页面不容易知道,但select1a.select_by_visible_text(m).click() 能得到你想要的吗?
  • 无属性点击
  • 为什么你不能只获取选项列表而不是x.text 并单击选项元素,它将从select1 列表框中选择列表项。
  • @DebanjanB 为什么这个答案被标记为重复? “原始”答案是在 Java 中。我问的问题是在 Python 中。
  • @DebanjanB 仅当“装订艺术”不是同一种语言时。我可以在字里行间阅读,但如果用提出问题的语言解释解决方案,也许会对其他人有所帮助。我会说英语,但我讨厌有人教我如何只用俄语弹吉他,尽管无论教练说什么语言,吉他的弹奏都是一样的。我的两分钱。

标签: python selenium selenium-webdriver


【解决方案1】:

因此,Selenium 单击不会触发附加到对象的所有 DOM 事件有一些奇怪之处。它通常是由于,比方说,未优化编写的前端代码。

但这里不做任何判断,因为 Selenium 只会遇到它真正不应该遇到的问题。

所以这里有一个建议。进入浏览器开发工具 > 控制台,然后尝试以下示例。我会用 JQuery 写这个,但是如果你没有 JQuery,请随意在页面上注入它,或者将代码更改为常规 document.getElement 代码。

$("#FirstComboBoxOption").click();

这会触发所有预期的事件吗?第二个 Combobox 是否正确填充?

使用它来点击一个元素并没有丢脸。我尽可能使用 Selenium 的点击,但 Selenium 的点击与真正的人类点击并不完全相同,因为鼠标/user32.dll 不用于执行点击。所以使用 javascript 虽然不理想,但如果它是触发对象上所有事件的唯一方法,它并没有错。

最好的情况是事件逻辑以一种不必要的方式连接起来,但我假设这不是一个选项。相反,我会这样做(请注意,我对 Selenium 使用 C#,所以这是对语法的一般猜测。认为它有点伪代码)

browser.execute_script("$('#FirstComboBoxOption').click()");

接下来,我假设这对你不起作用,所以这是下一个选项。

首先,查找附加到第一个组合框的所有事件,这些事件表面上触发了第二个组合框的填充。您可以使用 JQuery 执行此操作,如下所示:

var elem = $('#FirstComboBoxOption')[0];
$._data(elem, "events");

试一试,确保您知道真正的点击会触发哪些事件。然后,执行以下操作:

$('#FirstComboBoxOption').trigger('SomeExpectedEvent');

如果有多个事件,则为每个事件做一行。我只需要做一次上面的事件示例。这是最后的手段。总体而言,它确实没有任何问题,但只要有可能,使用尽可能接近真实用户交互的方式触发事物显然是一个更好的选择。

【讨论】:

  • 我无法访问 javascript。
  • 这是浏览器吗?因为如果它是浏览器,您可以访问 javascript。转到开发人员工具。然后转到控制台。您可以从那里运行 javascript。您不需要查看现有的 javascript。可以缩小;没关系。由于您在示例中使用了 Firefox,请转到此处:1) 菜单,右上角(汉堡菜单) 2) 选择 Web 开发人员 3) 选择 Web 控制台
  • 对不起。我没有意识到你可以像那样注入javascript。 JQuery 在我的实例中不起作用,但我会使用它。谢谢。
【解决方案2】:

您尝试过以下方法吗?

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
driver = webdriver.Firefox()
#Base URL
driver.get("https://example.com/")
def scrape():    
    #get manufacturer list
    select1 = driver.find_element_by_name("mnfr")
    makes = select1.find_elements_by_tag_name("option") # get the option elements
    print(makes)
    #get models list
    for m in makes:
        #click on list option
        m.click()
        select2 = driver.find_element_by_name("models")
        models = [x.text for x in select2.find_elements_by_tag_name("option")]
        print(models)
scrape()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-04
    • 2019-04-28
    • 2021-01-16
    • 2020-10-13
    • 1970-01-01
    • 2018-12-28
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多