使用Selenium WebDriver单击链接

时间:2018-06-19 22:35:05

标签: python selenium webdriver

我试图单击一个链接,但似乎无法正常工作。我一直单击到所需页面,但是不会单击最后一个链接。代码如下:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
import requests

import pandas as pd
import openpyxl
from password import DKpassword
#import SendKeys

beginningTime = time.time()
browser = webdriver.Chrome()
browser.get('https://www.draftkings.com/lobby')
browser.maximize_window()
time.sleep(5)
signinLink = browser.find_element_by_xpath("""//*[@id="react-mobile-home"]/section/section[2]/div[2]/div[3]/div/input""")
signinLink.click()
signinLink.send_keys("abcdefg")
signinLink.send_keys(Keys.TAB)
passwordLink = browser.find_element_by_xpath("""//*[@id="react-mobile-home"]/section/section[2]/div[2]/div[4]/div/input""")
passwordLink.send_keys(DKpassword)
passwordLink.send_keys(Keys.ENTER)
time.sleep(5)

if browser.current_url == "https://www.draftkings.com/account/sitelogin/false?returnurl=%2Flobby1":
    signin = browser.find_element_by_partial_link_text("SIGN IN")
    signin.click()
elif browser.current_url == "https://www.draftkings.com/lobby#/featured":

    mlbLink = browser.find_element_by_partial_link_text("MLB")
    mlbLink.click()
else:
    print("error")

time.sleep(5)
featuredGame = browser.find_element_by_class_name("GameSetTile_tag")
featuredGame.click()
time.sleep(5)
firstContest = browser.find_element_by_partial_link_text("Enter")
firstContest.click()

我收到错误消息,指出该元素在某一时刻不可点击...,另一个元素将获得该点击。任何帮助将不胜感激。我不在乎单击哪个竞赛,只要它在先前代码也指导的精选页面上就可以。

HTML code Webpage screenshot

3 个答案:

答案 0 :(得分:2)

可能有多种原因。

1。。您可能必须向下滚动或可能必须执行某些操作,以便脚本可见。

要向下滚动,您可以使用以下代码:

browser.execute_script("window.scrollTo(0, Y)")

其中 Y 是高度(在全高清显示器上为1080)

2。。可能存在多个Web元素,在这种情况下,您必须使用dom中的唯一元素,可以右键单击>检查>元素部分> CTRL + F>编写您的定位器(在您的情况下为xpath)以检查存在多少项。

您也可以尝试使用此xpath:

//a[contains(text(),'Enter') and contains(@href,'/contest/draftteam') and contains(@class,'dk-btn-dark')]  

代码:

WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "//a[contains(text(),'Enter') and contains(@href,'/contest/draftteam') and contains(@class,'dk-btn-dark')]"))

firstContest = browser.find_element_by_xpath("//a[contains(text(),'Enter') and contains(@href,'/contest/draftteam') and contains(@class,'dk-btn-dark')]")
firstContest.click()

答案 1 :(得分:1)

用操作类替换单击事件,它将解决此异常

public void updateFoo(LinkInfo linkInfo) {

LinkInfo temp = null;
for(LinkInfo curLinkInfo:fooSet) if (curLinkInfo.equals(linkInfo))temp = curLinkInfo;

if(temp!=null)
linkInfo.setId(temp.getId());

// now update set
fooSet.remove(linkInfo)
fooSet.add(linkInfo)

}

答案 2 :(得分:0)

我能够通过以下方式克服此异常:使用点击JavaScript执行器,而不是常规的Element.click(),如下所示-

WebElement element = webDriver.findElement(By.xpath(webElemXpath));
try {

    JavascriptExecutor ex = (JavascriptExecutor) webDriver;
    ex.executeScript("arguments[0].click();", element);
    logger.info(elementName was + " clicked");
} 
catch (NoSuchElementException | TimeoutException e) {
logger.error(e.getMessage());

}