Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用selenium单击多个链接_Python_Selenium - Fatal编程技术网

Python 使用selenium单击多个链接

Python 使用selenium单击多个链接,python,selenium,Python,Selenium,试图把一个更大的问题分解成更小的部分 我目前正在将一名拳击手的名字输入一个自动完成框,选择出现的第一个选项(拳击手的名字),然后单击查看更多,直到我得到所有拳击手的战斗列表,查看更多按钮停止出现 然后,我尝试创建一个onclick href列表,我想单击它们,然后迭代地单击每一个,并从每个页面/战斗中获取html。理想情况下,我想特别提取文本 这是我写的代码: page_link = 'http://beta.compuboxdata.com/fighter' chromedriver = '

试图把一个更大的问题分解成更小的部分

我目前正在将一名拳击手的名字输入一个自动完成框,选择出现的第一个选项(拳击手的名字),然后单击查看更多,直到我得到所有拳击手的战斗列表,查看更多按钮停止出现

然后,我尝试创建一个onclick href列表,我想单击它们,然后迭代地单击每一个,并从每个页面/战斗中获取html。理想情况下,我想特别提取文本

这是我写的代码:

page_link = 'http://beta.compuboxdata.com/fighter'
chromedriver = 'C:\\Users\\User\\Downloads\\chromedriver'
cdriver = webdriver.Chrome(chromedriver)
cdriver.maximize_window()
cdriver.get(page_link)
wait = WebDriverWait(cdriver,20)
wait.until(EC.visibility_of_element_located((By.ID,'s2id_autogen1'))).send_keys('Deontay Wilder')
wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'select2-result-label'))).click()
while True:
    try:
        element = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'view_more'))).click()
    except TimeoutException:
        break
# fighters =  cdriver.find_elements_by_xpath("//div[@class='row row-bottom-margin-5']/div[2]")
links = [x.get_attribute('onclick') for x in wait.until(EC.visibility_of_element_located((By.XPATH, "//*[contains(@onclick, 'get_fight_report')]/a")))]
htmls = []
for link in links:
    cdriver.get(link)
    htmls.append(cddriver.page_source)
但是,运行此命令会显示错误消息:

ElementClickInterceptedException          Traceback (most recent call last)
<ipython-input-229-1ee2547c0362> in <module>
     10 while True:
     11     try:
---> 12         element = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'view_more'))).click()
     13     except TimeoutException:
     14         break
ElementClickInterceptedException: Message: element click intercepted: Element <a class="view_more" href="javascript:void(0);" onclick="_search('0')"></a> is not clickable at point (274, 774). Other element would receive the click: <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">...</div>
  (Session info: chrome=78.0.3904.108)

但这似乎在ActionChains点创建了某种无限循环。似乎一直在等待查看更多href出现

单击功能应该已经移动了窗口,以便元素位于可查看窗口中。所以你不需要那个动作链(我想…),但是最初的错误在“查看更多”按钮上显示了一些其他元素

您可能需要从DOM中删除(或隐藏)这个元素,或者如果它是一个html窗口,请“忽略”它。因此,确定这个覆盖元素是关键,然后决定一个策略来揭开更多视图按钮


您的站点当时似乎不工作,因此我无法进一步深入。

单击功能应该已经移动了窗口,以便元素位于可视窗口中。所以你不需要那个动作链(我想…),但是最初的错误在“查看更多”按钮上显示了一些其他元素

您可能需要从DOM中删除(或隐藏)这个元素,或者如果它是一个html窗口,请“忽略”它。因此,确定这个覆盖元素是关键,然后决定一个策略来揭开更多视图按钮


您的站点当时似乎不起作用,因此我无法进一步深入。

有一条与您的站点类似的错误消息。“如果你试图实现投票数最高的答案,会发生什么?”凯文尝试了一下,似乎创造了一个类似于无限循环的东西。在我的问题中解释了这一点。我注意到元素有一个属性
onclick=“\u search('0')
。也许您可以完全不按按钮,只执行
\u search('0'))
直接?我不确定Selenium是否能做到这一点,但值得研究。它与您的错误消息类似。如果您尝试实现最受欢迎的答案,会发生什么情况?@Kevin尝试了它,似乎创建了一个类似于无限循环的循环。在我的问题中解释了这一点。我注意到元素有一个属性
onclick=“\u search('0'))
。也许您可以完全不按按钮,直接执行
\u search('0')
?我不确定Selenium是否能做到这一点,但值得研究。我知道,不确定如何做到这一点,网站现在似乎正在运行好了,肯定有一个横幅广告可能会妨碍链接。最简单的方法是从DOM中识别并删除它,但在单击元素之前,不必等待元素在DOM中可用。我指的是点击查看更多的HREF(代码是这样的)…也许我误读了你的回答?“可见性意味着元素不仅显示,而且高度和宽度都大于0。”我明白了,不知道怎么做,网站现在似乎正在运行OK,肯定有一个横幅广告可能会妨碍链接。最简单的方法是从DOM中识别并删除它,但在单击元素之前,不必等待元素在DOM中可用。我指的是在视图中点击更多的HREF(代码是这样的)……也许我误解了您的回答?“可见性意味着元素不仅显示,而且高度和宽度都大于0。”
while True:
    try:
        element = cdriver.find_element_by_class_name('view_more')
        webdriver.ActionChains(cdriver).move_to_element(element).click(element).perform()
#         element = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'view_more'))).click()
    except TimeoutException:
        break
links = [x.get_attribute('onclick') for x in wait.until(EC.visibility_of_element_located((By.XPATH, "//*[contains(@onclick, 'get_fight_report')]/a")))]
htmls = []
for link in links:
    cdriver.get(link)
    htmls.append(cddriver.page_source)