【问题标题】:Clicking an element doesn't trigger same behaviour as manually clicking it单击一个元素不会触发与手动单击它相同的行为
【发布时间】:2021-12-19 16:20:49
【问题描述】:

我找到了我想要单击的元素,但是每当 Selenium 单击它时,页面不会表现出与我自己手动单击它时相同的行为。如果你去https://www.just-eat.co.uk/restaurants-mcdonalds-victorialondon/menu,选择“Double Big Mac Meal”并点击弹出窗口中的一个项目,你会注意到弹出窗口会自动滚动到下一个部分,当所有需要的部分都被选中时,底部的按钮会亮起橙色。但是,当我运行以下脚本时,它会很好地单击元素,但不会触发自动滚动,也不会在单击所有必需元素后按钮亮起橙色。

基本上用 selenium 点击元素与手动点击它是不同的,但我不知道为什么。我试过了:

  • Webdrive 等待
  • 动作链
  • execute_script("arguments[0].scrollIntoView();"
  • 单击元素的父级(和所有父级)
  • 单击元素的子元素
  • 在元素上按“Enter”而不是单击

有谁知道为什么单击该元素不会导致相同的行为或我可以尝试单击该元素的其他什么?

这是一个最小的可运行示例:

import requests
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import json
import ssl
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time
import difflib

url = "https://www.just-eat.co.uk/restaurants-mcdonalds-victorialondon/menu"
browser = webdriver.Firefox()
browser.get(url)
browser.maximize_window()
main = "Double Big Mac Meal"
browser.find_element_by_css_selector("button.Button_o-btn_1KX8u:nth-child(2)").click()
h3_tags = browser.find_elements_by_tag_name('h3')
for tag in h3_tags:
    if tag.text == main:
        tag.click()

add_ons = WebDriverWait(browser, 10).until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, "c-itemSelector-section-label")))
for a in add_ons:
    add_on = browser.find_elements_by_tag_name('span')
add_on_list = []
for i in add_on:
    add_on_list.append(i.text)
action = ActionChains(browser)
element1 = "Side Salad"
if element1:
    spans = browser.find_elements_by_tag_name("span")
    for span in spans:
        if span.text == element1:
            popup = browser.find_element_by_css_selector('.c-megaModal-document--scrollable')
                   
            x = False
            while x == False:
                try:
                    element = browser.find_element_by_xpath(f'//span[contains(text(), "{element1}")]')
                    time.sleep(2)

                    x = True
                    break
                except Exception as e:
                    print(e)
                    popup.send_keys(Keys.ARROW_DOWN)
                    time.sleep(0.5)

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    这是一个点亮订单按钮的解决方案

    main = "Double Big Mac Meal"
    h3_tags = driver.find_elements_by_xpath('//h3[contains(.,"Double Bacon Egg McMuffin® Meal") and contains(.,"Double Bacon Egg McMuffin® Meal")]')
    h3_tags = driver.find_elements_by_tag_name('h3')
    for tag in h3_tags:
        if tag.text == main:
            print(tag.text)
            tag.click()
    
    
    
    addons_selected = ['Medium Meal','Side Salad', 'McCafé® Flat White' ]
    
    #select only option, not things to remove, for that its just another class to add
    add_ons = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.XPATH , '//span[@data-test-id="single-select-name"]')))
    
    add_on_list = []
    time.sleep(1)
    
    id = -1
    for i in add_ons:
        id += 1
        if( i.text in addons_selected):
            print(i.text)
            but = i.find_element_by_xpath('./ancestor::label')
            try:
                but.click()
                time.sleep(2)
            except ElementClickInterceptedException:
                driver.execute_script('arguments[0].scrollIntoView(true);', add_ons[id - 3])
                time.sleep(2)
                but.click()
                time.sleep(2)
            add_on_list.append(i.text)
    

    【讨论】:

    • 感谢您的帮助,但帽子似乎没有修复它,我在循环通过 add_ons 时遇到了 except 语句错误。它意识到它看不到“中餐”按钮,因此进入了除外部分,但由于某种原因没有将其滚动到视图中而是滚动过去,然后当它再次尝试单击该按钮时它仍然不是t 在视图中,它崩溃了
    【解决方案2】:

    您的按钮的 xpath 可能存在问题,因为您提到了一条错误消息,指出该按钮不可见,并且它会滚动过去。

    此外,请尝试使用显式等待,直到元素可见后再单击按钮。

    element = wait.until(EC.visibility_of_element_located((By.ID, 'id')))
    

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 2016-04-06
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      相关资源
      最近更新 更多