【问题标题】:simulate a onclick with selenium python使用 selenium python 模拟 onclick
【发布时间】:2017-09-17 19:17:23
【问题描述】:

我对 selenium 很陌生,我正在尝试弄清楚如何模拟 onclick

这是我在检查 html 源代码时在源代码中看到的内容

<a href="#" onclick="document.getElementById('pN').selectedIndex = 0;document.getElementById('optionList').submit();return false"> <img src="images/ListingOptionSearch.jpg" onmouseover="this.src='images/ListingOptionSearchHover.jpg'" onmouseout="this.src='images/ListingOptionSearch.jpg'"> </a>

我试过了:

driver.find_element_by_css_selector("a[onlick*=document.getElementById('pN')
.selectedIndex]").click()

但我收到了InvalidSelectorException

有什么想法吗?

谢谢!

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping


    【解决方案1】:

    你可以使用

    from selenium import webdriver
    browser = webdriver.Chrome(somepath) # You should know what this does.
    browser.execute_script("document.getElementById('pN').selectedIndex = 0;document.getElementById('optionList').submit();return false")
    

    意思是你可以通过使用 .execute_script 来执行 Javascript 代码,太棒了,对吧?

    无效的InvalidSelectorException 是在没有元素或经验时引发的期望,可能存在 iframe,您必须使用 .switch_to.frame 才能与之交互。 另外,我喜欢使用 XPath(总是最可靠的),它需要一点时间来适应,但是通过一两个小时的练习,你就可以掌握它。

    JeffC 有一个好点,HTML 的结构,JS 总是可以变化的。 您可以使用find_element_by_xpath(xpath).click(),但也有更多动态方法来预测结构是否会发生变化,例如使用find_element_by_name或其他可用

    find_element_by_id
    find_element_by_name
    find_element_by_xpath
    find_element_by_link_text
    find_element_by_partial_link_text
    find_element_by_tag_name
    find_element_by_class_name
    find_element_by_css_selector
    

    【讨论】:

    • 你真的不想这样做。这正在调用恰好位于 A 标签上的 JS。如果onclick 发生变化,您将不再像单击A 标签那样做同样的事情。此外,许多(大多数?)人正在尝试编写用户场景脚本并且没有用户会执行 JS,他们将点击链接(然后触发 onclick 行为)。
    • 好点 JeffC,这是一种做事方式。当站点结构发生变化时(无论是 HTML/js),您通常都必须进行更改/调整。我添加了一些代码和解释。我从经验中发现,网站大多不会改变这样的事情,但刮板可以持续 1-10 年而不改变网站。您还应该添加随意尝试,除了在发生这种情况时通知您的块。
    【解决方案2】:

    你用谷歌搜索了异常吗?这意味着您的选择器无效。像您尝试使用的 CSS 选择器采用 tag[attribute='value'] 的形式。您没有用引号括起来的值...在这种特定情况下这是不可能的,因为您的值已经包含单引号。

    因为A标签包含了IMG标签,所以点击IMG标签也可以得到同样的效果。像下面这样的 CSS 选择器应该可以工作。

    img[src='images/ListingOptionSearch.jpg']
    

    还有其他选择器可能会起作用,但带有指向页面的链接等。我只是猜测它们是否是唯一的。

    【讨论】:

    • 嘿,杰夫,谢谢你的颜色,所以我会做driver.find_element_by_css_selector("img[src='images/ListingOptionSearch.jpg']").click() ?
    • 是的......这应该可以工作,因为图像在 A 标签内。
    猜你喜欢
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多