使用硒刮时如何在另一部分中单击相同的按钮

时间:2019-07-29 18:47:53

标签: python selenium web-scraping

因此,我正在使用硒进行抓取,我想单击“防御性”部分中的“下一步”按钮,但是我编写的代码在“摘要”中单击了“下一步”。

这是您尝试使用的网址:

https://www.whoscored.com/Regions/252/Tournaments/2/Seasons/7361/Stages/16368/PlayerStatistics/England-Premier-League-2018-2019

因此它正在选择“防御性”,我可以在窗口中看到它的选择,但没有出现下一页。单击“摘要”后,我发现下一个功能实际上正在发生。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser= webdriver.Chrome(executable_path ="C:\Program Files (x86)\Google\Chrome\chromedriver.exe") 
browser.get('https://www.whoscored.com/Regions/252/Tournaments/2/Seasons/7361/Stages/16368/PlayerStatistics/England-Premier-League-2018-2019')


browser.find_element_by_xpath("""//*[@id="stage-top-player-stats-options"]/li[2]/a""").click()

element = WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, """//*[@id="next"]""")))
browser.execute_script("arguments[0].click();", element)

3 个答案:

答案 0 :(得分:0)

下一个按钮的xpath在此页面上不是唯一的。试试这个,

element = WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@id='stage-top-player-stats-defensive']//a[@id='next']")))
browser.execute_script("arguments[0].click();", element)

element = WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.XPATH, "//*[@id='stage-top-player-stats-defensive']//a[@id='next']")))
element.click()

答案 1 :(得分:0)

对于每个选项卡(摘要,防御,..),将新的下一个按钮添加到DOM中,并添加相同的id=next
选择“防御”,您将看到接下来的两个按钮具有相同的id=next,选择“进攻”,将有三个下一步按钮。
使用基本的id=next选择器,您始终单击“摘要”标签中的第一个下一个按钮。因为您使用的是JavaScript,但没有任何反应,请尝试使用Selenium click方法单击,您会收到错误消息。
要解决该问题,请调整您的选择器,使其更适合dom-#statistics-paging-defensive #next

此外,当您第一次打开页面时,会出现Cookie接受屏幕并阻止该页面,您可以使用以下方法将其跳过。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import selenium.common.exceptions as EX


def accept_cookies():
    try:
        WebDriverWait(browser, 20)\
            .until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.qc-cmp-button")))\
            .click()
    except EX.NoSuchElementException or EX.TimeoutException:
        pass

#...

browser = webdriver.Chrome(executable_path ="C:\Program Files (x86)\Google\Chrome\chromedriver.exe") 
browser.get('https://www.whoscored.com/Regions/252/Tournaments/2/Seasons/7361/Stages/16368/PlayerStatistics/England-Premier-League-2018-2019')

wait = WebDriverWait(browser, 20)
browser.get(baseUrl)

accept_cookies()

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[href='#stage-top-player-stats-defensive']"))).click()
next_button = wait.until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "#statistics-paging-defensive #next")))
next_button.click()

答案 2 :(得分:0)

  1. 您的元素定位符必须是唯一的
  2. 避免使用XPath通配符-*,因为它会导致性能下降和元素查找时间延长
  3. 避免使用JavaScriptExecutor进行点击,行为良好的Selenium测试必须执行真实用户的操作,而且我怀疑真实用户是否会打开浏览器控制台并输入类似document.getElementById('next').click()的内容,他会使用鼠标

假设以上所有内容,您都需要一个选择器,该选择器可以唯一标识next标签上的Defensive按钮,该按钮类似于:

//div[@id='statistics-paging-defensive']/descendant::a[@id='next']

参考文献: