【问题标题】:Trying to click an element on a webpage using selenium尝试使用硒单击网页上的元素
【发布时间】:2020-12-11 06:29:28
【问题描述】:
我正在尝试编写一个脚本来填写表格,但我很难点击免费的 sim 链接,我尝试使用多个不同的标识符,但似乎无法正常工作。非常感谢任何帮助!谢谢
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time
PATH = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://mobile.lebara.com/gb/en/free-sim")
driver.implicitly_wait(5)
cookie = driver.find_element_by_id("onetrust-accept-btn-handler")
freesim = driver.find_element_by_class_name("product-item payAsYouGoProductListerItem clickable")
actions = ActionChains(driver)
actions.click(cookie).perform()
driver.implicitly_wait(5)
actions.click(freesim).perform()
【问题讨论】:
标签:
python
selenium
xpath
css-selectors
webdriverwait
【解决方案1】:
- 您必须处理“接受 cookie”横幅(点击它,您不需要操作,只需 EC 然后点击)
- 将代码中的所有隐式等待替换为 expected_conditions
(如果所有这些建议都不适用于您必须使用代码和硒异常更新您的问题)
【解决方案2】:
您需要点击“接受cookies”或执行JS代码隐藏“Your cookies”覆盖然后搜索链接。
driver.implicitly_wait(5)
cookie = driver.find_element_by_id("onetrust-accept-btn-handler")
cookie.click()
freesim = driver.find_element_by_link_text("Free Sim")
freesim.click()
请注意,您尝试将多个类名传递给 find_element_by_class_name(您只需要传递一个)并多次调用 driver.implicitly_wait(5)(您可能只需要这样做一次)
【解决方案3】:
您的类名包含空格,因此实际上是多个类名。您可以通过在每个类名前加上一个点来制作 CSS 选择器。
CSS Selector ->> ".product-item.payAsYouGoProductListerItem.clickable"
您还必须等到元素可点击后才能点击。在您的代码中添加/更改它。您的其余代码工作正常。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
....
....
....
freesim = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".product-item.payAsYouGoProductListerItem.clickable")))
freesim.click()
【解决方案4】:
要点击元素Free Sim,您可以使用以下任一Locator Strategies:
理想情况下,点击您需要为WebDriverWait 诱导element_to_be_clickable() 的元素,您可以使用以下任一Locator Strategies:
-
使用CSS_SELECTOR:
driver.get("https://mobile.lebara.com/gb/en/free-sim")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#onetrust-accept-btn-handler"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href='free-sim-direct']"))).click()
-
使用XPATH:
driver.get("https://mobile.lebara.com/gb/en/free-sim")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@id='onetrust-accept-btn-handler']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='free-sim-direct']"))).click()
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC