NaiboWang / EasySpider

A visual no-code/code-free web crawler/spider易采集:一个可视化浏览器自动化测试/数据采集/爬虫软件,可以无代码图形化的设计和执行爬虫任务。别名:ServiceWrapper面向Web应用的智能化服务封装系统。
https://www.easyspider.net
Other
35.64k stars 4.36k forks source link

弹窗是confirm #163

Closed jiehuiDT closed 1 year ago

jiehuiDT commented 1 year ago

你好,大佬,切换下拉选项按文本切换,弹窗是confirm,页面无法定位到元素,请问怎么解决。 另外,请教一下,怎么定位到dialog的元素,id经常变换

NaiboWang commented 1 year ago

自定义操作写python: https://juejin.cn/post/6857700124010348552

ID经常变换试着用CSS Selector等其他方式定位,或者//dialog这种,或者直接写Selenium语句,有些网站就是这样做的,不让你固定元素ID以实现反爬。

jiehuiDT commented 1 year ago

页面操作过程中出现的弹窗,对于弹窗,在自定义操作使用python exec操作,填写 self.browser.switch_to.alert().accept() 弹窗会消失,但是查看后台,报错之后卡住不动,请问大佬是哪里需要修改。 Traceback (most recent call last): File "threading.py", line 1038, in _bootstrap_inner File "easyspider_executestage.py", line 351, in run File "easyspider_executestage.py", line 739, in executeNode File "easyspider_executestage.py", line 744, in executeNode File "easyspider_executestage.py", line 1372, in clickElement File "selenium\webdriver\remote\webdriver.py", line 492, in execute_script File "selenium\webdriver\remote\webdriver.py", line 429, in execute File "selenium\webdriver\remote\errorhandler.py", line 242, in check_response selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: 切换成功 Message: unexpected alert open: {Alert text : 切换成功} (Session info: chrome=115.0.5790.171) Stacktrace: Backtrace: GetHandleVerifier [0x00007FF640494A62+57106] (No symbol) [0x00007FF64040CF52] (No symbol) [0x00007FF6402DE2CB] (No symbol) [0x00007FF64034E762] (No symbol) [0x00007FF640336793] (No symbol) [0x00007FF64030CE81] (No symbol) [0x00007FF64030E064] GetHandleVerifier [0x00007FF640744222+2873042] GetHandleVerifier [0x00007FF640796590+3209792] GetHandleVerifier [0x00007FF64078F3AF+3180639] GetHandleVerifier [0x00007FF640525F25+652245] (No symbol) [0x00007FF640418618] (No symbol) [0x00007FF6404147C4] (No symbol) [0x00007FF6404148BC] (No symbol) [0x00007FF640404C33] BaseThreadInitThunk [0x00007FFBBDC83034+20] RtlUserThreadStart [0x00007FFBBEB41551+33]

NaiboWang commented 1 year ago

首先就是语句写的有问题,switch_to.alert后没有括号:

self.browser.switch_to.alert.accept()

然后就是这个功能我也没有详细测试过,你尝试下面给的方案:

这个异常表明在您试图执行某些操作时,出现了意外的警告对话框。一种可能的解决方案是在执行造成异常的操作之前,先等待JavaScript警告对话框出现,然后接受或者拒绝它。

Selenium提供了一个叫WebDriverWait的等待机制,可以设置一个等待时间,在这个时间内如果满足条件就立即执行下一步,如果时间结束还没有满足条件,就抛出TimeoutException。

这里是如何使用WebDriverWait来等待并处理警告的例子:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
    # 等待警告出现并获取警告对话框
    WebDriverWait(self.browser, 5).until(EC.alert_is_present())

    # 切换到警告并接受
    alert = self.browser.switch_to.alert
    alert.accept()
except Exception as e:
    print(e)

在此代码中,首先尝试执行可能会造成意外警告的操作。然后,使用WebDriverWait等待警告出现,如果在5秒内警告出现,则接受警告后进行后续操作。如果5秒结束还没有等到警告,就会抛出TimeoutException异常。

如果实在解决不了,我会在忙完这段时间后去测试和开发,不过就需要等一段时间了。

jiehuiDT commented 1 year ago

感谢大佬,可以解决,然后发现一个比较有意思的地方,用自定义操作,执行这个操作,要选操作在iframe内