如何使用python中的动态代码关闭弹出窗口

时间:2019-01-28 00:09:31

标签: python selenium

我是硒新手,对python的了解很低。 只是我想关闭此页面https://it.ogame.gameforge.com/上的弹出窗口 它显示在页面顶部 弹出窗口不是问题,但想知道如何解决此问题。

我用chrome检查了元素,然后复制/粘贴了xpath。 使用代码 find_element_by_xpath('xpath code').click() 它可以正常工作,并且弹出窗口关闭,但是如果我刷新页面并使用相同的代码重试,则不再起作用,因为其中的一部分代码是动态的。我该如何解决这个问题? 我用Google搜索了几个小时,但暂时没有解决办法。

这是元素

<a href="javascript:;" onclick="MAX_simplepop_8afcd70d('close'); return false;">x</a>

xpath中的等效项是//*[@id="MAX_8afcd70d"]/div[1]/a 但是“ MAX_8afcd70d”部分一直在变化。

这是代码

from selenium import webdriver
import time
import traceback

driver=webdriver.Chrome()
driver.get('https://it.ogame.gameforge.com/')

time.sleep(2)
try:
    driver.find_element_by_xpath('//*[@id="MAX_8afcd70d"]/div[1]/a').click()
except:
     traceback.print_exc()

finally:

    time.sleep(3)
    driver.close()

##driver.find_element_by_link_text('x').click()
##this works

注释的代码可以工作,但是非常简单,我认为它不能一直工作。

只想知道如何使用硒管理页面中的动态代码。

3 个答案:

答案 0 :(得分:0)

尝试一下。希望每次运行时它都能正常工作。

driver.find_element_by_xpath('//div[@class="openX_interstitial"]/div[1]/a').click()

让我知道这是否对您有用。

答案 1 :(得分:0)

对于您的情况,您在元素中具有唯一的类名,可用于轻松查找元素,而无需使用动态元素。

driver.find_element_by_xpath('//div[@class="openX_interstitial"]/div[1]/a').click()

但是,如果您特别想尝试处理动态路径,则可以尝试

driver.find_element_by_xpath('//div[contains(@id, "MAX_")]/div[1]/a')

driver.find_element_by_xpath('//div[starts-with(@id, "MAX_")]/div[1]/a')

答案 2 :(得分:0)

这是带有is_displayed()检查的版本。

// check if popup class is displayed.
popupelement = driver.find_element(By.CLASS_NAME, 'openX_int_closeButton')
if popupelement.is_displayed():
  print "Popup class is displayed";
  // safe-wait to be clickable
  wait = WebDriverWait(driver, 10)
  xbutton = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[@id='openXHackFoo']//div[@class='openX_int_closeButton']/a)))
  xbutton.click();
else:
  print "Popup page is not displayed"