本意是想写一个自动领取dnf每日签到奖励的小脚本,实际上是功能是已经实现了,可以领取奖励了。
但是我后续想要提取领完奖励后弹窗的文本,直接浏览器里复制xpath,提取不出来。
//*[@id="showAlertContent"]
我就以为是遇到了类似iframe的情况,需要先特殊处理,搜索了一下,发现了关于alert的处理
driver.switch_to.alert()
?
然而报错了,于是又去找no such alert的相关问题,alert还未加载出来导致报错,增加延迟就能解决。然而我尝试了一下,还是报错。
我又去找了下别的带有alert的网页,写了个简单的网页以及程序去跑,发现是能成功的
<html>
<head>
<script type="text/javascript">
function display_alert()
{
alert("I am an alert box!!")
}
</script>
</head>
<body>
<input type="button" onclick="display_alert()"
value="Display alert box" />
</body>
</html>
from selenium import webdriver
driver = webdriver.Edge()
driver.get('file:///C:/Users/A/Desktop/10.html')
driver.find_element_by_xpath('/html/body/input').click()
print(driver.switch_to.alert.text)
我仔细对比了一下dnf网页以及作为例子的网页,发现这两者的弹窗是有差别的,dnf的弹窗存在时,我还可以对网页进行下拉等操作,但是简单例子的弹窗存在时,我只能先关闭弹窗再对网页进行操作。
排除了alert的问题,绕了一圈,我又绕回来了。因为弹窗的提示信息是在执行了js之后才出现的,而弹窗提示下的‘确认’二字是一直存在的,于是我尝试修改xpath去提取,一开始想着节省时间,注释掉了中间登陆的代码, 直接去提取确认,发现没提取出来。然后取消注释之后又能提取出来了。
driver = webdriver.Edge()
driver.get('https://dnf.qq.com/lbact/a20210617comic/index.html')
# #登陆账号
# login_2=driver.find_element_by_xpath('//*[@id="dologin"]')
# driver.execute_script("arguments[0].click();",login_2)
# driver.switch_to.frame('loginIframe')
# qq=driver.find_element_by_xpath('//*[@id="img_out_xxxxxx"]') #xxxxx为qq号
# webdriver.ActionChains(driver).move_to_element(qq).click(qq).perform()
# # driver.switch_to_default_content()#释放frame
# driver.switch_to.parent_frame()#返回父集 也能释放iframe
# a=driver.find_element_by_xpath('//*[@id="Hold_774826"]')
# time.sleep(2)
# driver.execute_script("arguments[0].click();",a)
# time.sleep(1)
a=driver.find_element_by_xpath('//*[@id="showAlert"]/div/a')
print(a.text)
我继续修改xpath,改成了 //*[@id="showAlert"]/div/p,然后就能成功提取出弹窗的文本了。
总结:
1.弹窗与弹窗不能一概而论,得具体问题具体分析。
2.未登录状态下,未能提取到‘确认’,隐藏元素无法直接获取
3.所以为什么//*[@id="showAlertContent"]不能提取到弹窗的文本呢?我还是没想明白
第一次发帖,虽然没什么技术含量,但也算记录我学习的一个过程了
|