Python 单击不可见的图元(其中有滑块)

Python 单击不可见的图元(其中有滑块),python,selenium,xpath,selenium-webdriver,web-scraping,Python,Selenium,Xpath,Selenium Webdriver,Web Scraping,在selenium中是否有方法单击视线之外的元素? 我正在尝试单击滑块上的所有元素,以便可以刮取每页。但是,该作业给了我一个错误: Traceback (most recent call last): File "C:/Users/Bain3/PycharmProjects/untitled4/TOPBETTA.py", line 1329, in <module> clickMe = wait(driver, 10).until(EC.element_to_be_cli

在selenium中是否有方法单击视线之外的元素? 我正在尝试单击滑块上的所有元素,以便可以刮取每页。但是,该作业给了我一个错误:

Traceback (most recent call last):
  File "C:/Users/Bain3/PycharmProjects/untitled4/TOPBETTA.py", line 1329, in <module>
    clickMe = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '("//*[@class="name"]//span")[%s]' % str(index + 1))))
  File "C:\Users\Bain3\Anaconda3\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 
不幸的是,上述代码没有帮助,并给出:

Traceback (most recent call last):
  File "C:/Users/Bain3/PycharmProjects/untitled4/TOPBETTA.py", line 1329, in <module>
    driver.execute_script('document.getElementByxpath("//*[@class="name"]//span").style.visibility = "visible";')
  File "C:\Users\Bain3\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 532, in execute_script
    'args': converted_args})['value']
  File "C:\Users\Bain3\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 297, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Bain3\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Runtime.evaluate threw exception: SyntaxError: missing ) after argument list
  (Session info: chrome=61.0.3163.100)
  (Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Windows NT 10.0.16299 x86_64)

元素在Selenium中不可见时不可单击。您必须使用滚动按钮来单击所有元素。

尝试以下解决方案来刮取所需页面:

url = "https://www.topbetta.com.au/sports/football/"
driver.get(url)

counter = 0
for link in range(len(wait(driver, 15).until(EC.presence_of_all_elements_located((By.XPATH, '//a[@href="/sports" and ./div[@class="name"]]'))))):
    wait(driver, 15).until_not(EC.visibility_of_element_located((By.CLASS_NAME, "mask")))
    link = wait(driver, 15).until(EC.presence_of_all_elements_located((By.XPATH, '//a[@href="/sports" and ./div[@class="name"]]')))[counter]
    link.location_once_scrolled_into_view
    link = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '(//a[@href="/sports" and ./div[@class="name"]])[%s]' % str(counter + 1))))
    wait(driver, 15).until_not(EC.visibility_of_element_located((By.CLASS_NAME, "mask")))
    link.click()
    print(driver.current_url)
    wait(driver, 10).until(EC.staleness_of(driver.find_element(By.XPATH, '//div[@class="competition-events-module"]')))
    counter += 1
    driver.get(url)

只需将
print(driver.current\u url)
替换为要应用于每个页面的代码

假设您有:clickMe=wait(driver,10)。直到(EC.element\u可点击((By.XPATH,“//*[@class=“name”]///span”)[%s]'%str(index+1)))。selenium如何知道要单击哪个滚动按钮元素以导航到要单击的元素。clickMe元素不可见,但确实存在。您可以搜索它,确定它位于滚动列表的哪个元素中。有了它,您可以决定使用哪个按钮滚动。之后,您可以检查是否显示clickMe。如果不是,请进一步滚动到元素。我不确定我是否理解如何才能做到这一点。嗯,限制是它会单击正确的导航器(如果找不到元素)。然后。。。最后,您必须执行if-element如果找不到我要查找的元素,请单击右导航器。如果右导航器不存在,请单击左键直到找到,或者单击左键直到导航器不存在。。我想这是可能的,但相当缓慢。HMMMMYou可以获取滚动元素中的整个项目列表。您可以通过isDisplayed属性确定哪些元素是可见的。这样你就知道你必须点击右或左滚动按钮。你能提供一个工作示例来说明如何做到这一点吗?这可能是一个可行的解决方案。对我来说,它通过相同的链接循环。这是我的密码。我想知道为什么。。。嗯,我想我看到问题了。它正在打印新的Href,但没有导航到它。我想您应该在
计数器+=1
之前放置更多代码。我的意思是从
#Team
开始的代码,它正在打印当前的url,但页面保持不变。所以它点击了它,但是页面保持不变,所以一个页面的数据被刮去了。真奇怪。这是因为正如我已经告诉过你的,你应该把用来抓取数据的代码放在
driver.get(url)
所有那些从
#Team
开始的行前面
driver.get(url)
。或在计数器+=1之前。它不符合。。。。或者代替
打印(driver.current\u url)
:)
Code:

try:
    os.remove('vtg121.csv')
except OSError:
    pass

driver.get('https://www.topbetta.com.au/sports/football/')

#SCROLL_PAUSE_TIME = 0.5


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

#clickMe = wait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, ('//*[@id="TopPromotionBetNow"]'))))
#if driver.find_element_by_css_selector('#TopPromotionBetNow'):
    #driver.find_element_by_css_selector('#TopPromotionBetNow').click()

#last_height = driver.execute_script("return document.body.scrollHeight")

#while True:

    #driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")


    #time.sleep(SCROLL_PAUSE_TIME)


    #new_height = driver.execute_script("return document.body.scrollHeight")
    #if new_height == last_height:
        #break
    #last_height = new_height

time.sleep(1)

#clickMe = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, ('//div[text()="Soccer"][contains(@class, "wn-Classification")]'))))
#clickMe.click()
#time.sleep(0)
options = driver.find_elements_by_xpath('//*[@class="name"]//span')

indexes = [index for index in range(len(options))]
shuffle(indexes)
for index in indexes:
    time.sleep(0)
    clickMe = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '("//*[@class="name"]//span")[%s]' % str(index + 1))))
    clickMe.click()
    time.sleep(0)

    # Team
    clickMe = wait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,("#js_body-region > div > div:nth-child(1) > div.sports-body-region > div.js_event-list-region > div > div.js_events-container.events-container > div > div.js_event-region.event-region > div > a > div > div.team-container.home > div"))))
    langs3 = driver.find_elements_by_css_selector("#js_body-region > div > div:nth-child(1) > div.sports-body-region > div.js_event-list-region > div > div.js_events-container.events-container > div > div.js_event-region.event-region > div > a > div > div.team-container.home > div")
    langs3_text = []

    for lang in langs3:
        #print(lang.text)

        langs3_text.append(lang.text)
    time.sleep(0)

    # Team ODDS
    langs = driver.find_elements_by_css_selector(" #js_body-region > div > div:nth-child(1) > div.sports-body-region > div.js_event-list-region > div > div.js_events-container.events-container > div > div.js_event-region.event-region > div > div > div > div.js_teams-container.market-items > div.head-to-head-item.home > div > div > button.js_price-button.price")

    langs_text = []

    for lang in langs:
        #print(lang.text)
        langs_text.append(lang.text)
    time.sleep(0)

    # Draw odds
    #langs1 = driver.find_elements_by_xpath("//ul[@class='runners']//li[2]")
    langs1 = driver.find_elements_by_css_selector("#js_body-region > div > div:nth-child(1) > div.sports-body-region > div.js_event-list-region > div > div.js_events-container.events-container > div > div.js_event-region.event-region > div > a > div > div.team-container.away > div")
    langs1_text = []

    for lang in langs1:
        #print(lang.text)
        langs1_text.append(lang.text)
    time.sleep(0)

    # HREF
    #langs2 = driver.find_elements_by_xpath("//ul[@class='runners']//li[1]")
    url1 = driver.current_url




    print(("NEW LINE BREAK"))
    import sys
    import io


    with open('vtg121.csv', 'a', newline='', encoding="utf-8") as outfile:
        writer = csv.writer(outfile)
        for row in zip(langs_text, langs1_text, langs3_text):
            writer.writerow(row + (url1,))
            print(row + (url1,))
url = "https://www.topbetta.com.au/sports/football/"
driver.get(url)

counter = 0
for link in range(len(wait(driver, 15).until(EC.presence_of_all_elements_located((By.XPATH, '//a[@href="/sports" and ./div[@class="name"]]'))))):
    wait(driver, 15).until_not(EC.visibility_of_element_located((By.CLASS_NAME, "mask")))
    link = wait(driver, 15).until(EC.presence_of_all_elements_located((By.XPATH, '//a[@href="/sports" and ./div[@class="name"]]')))[counter]
    link.location_once_scrolled_into_view
    link = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '(//a[@href="/sports" and ./div[@class="name"]])[%s]' % str(counter + 1))))
    wait(driver, 15).until_not(EC.visibility_of_element_located((By.CLASS_NAME, "mask")))
    link.click()
    print(driver.current_url)
    wait(driver, 10).until(EC.staleness_of(driver.find_element(By.XPATH, '//div[@class="competition-events-module"]')))
    counter += 1
    driver.get(url)