如何使用 Selenium 和 Python 在 https://meet.google.com 中单击 Ask to join 按钮?
How to click on the Ask to join button within https://meet.google.com using Selenium and Python?
我正在尝试在 google 会议 link 中单击请求加入按钮(使用我现有的 Google Chrome 个人资料)。这是代码:
options = webdriver.ChromeOptions()
options.add_argument(r"--user-data-dir=C:\Users\Pranil.DESKTOP-TLQKP4G.000\AppData\Local\Google\Chrome\User Data")
browser = webdriver.Chrome(ChromeDriverManager().install(), options=options)
delay = 15
browser.get('https://meet.google.com/tws-kcie-aox')
ignored_exceptions=(NoSuchElementException,StaleElementReferenceException,)
time.sleep(5)
join_butt = WebDriverWait(browser, delay ,ignored_exceptions=ignored_exceptions).until(EC.presence_of_element_located((By.XPATH, '//*[@id="yDmH0d"]/c-wiz/div/div/div[5]/div[3]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div')))
join_butt.click()
print(join_butt.text)#this prints Ask to join
但是没有点击加入按钮。按钮上最奇怪的部分 'Ask to join' 文本确实打印在最后一行。这意味着硒已到达正确的按钮。但是为什么还是不点击按钮呢?
编辑:
根据@Alin Stelian 的回答,我更新了代码如下:
browser.get('https://meet.google.com/hst-cfck-kee')
browser.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 'd')
join_butt = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.XPATH, "//span[contains(text(),'Ask to join')]")))
join_butt.click()
print(join_butt)
print(join_butt.text)
这确实有效,因为两个打印语句都有效...但是按钮没有被点击。这里出了什么问题?
You can use the quickest path
//span[contains(text(),'Ask to join')]
or from your code correct xpath
//*[@id="yDmH0d"]/c-wiz/div/div/div[4]/div[3]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div/span/span
your xpath in the Code
//*[@id="yDmH0d"]/c-wiz/div/div/div[5]/div[3]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div
在您不拥有的网站上使用 Selenium 时,从不 依赖 ID 或 类,因为它们经常更改,尤其是 google'网站。
搜索它的最佳方法是找到显示您知道写在按钮上的文本的元素(在本例中为请求加入),然后让所有父项循环并检查是否有一些它们是按钮。
像这样:
WebElement buttonTextElement = browser.find_elements_by_xpath("//*[contains(text(), 'Ask to join')]")
然后循环启动此 javascript 代码,仅当父角色属性等于“按钮”或标记为“按钮”时才停止它
WebElement parent = buttonTextElement;
WebElement parent = browser.execute_script("return arguments[0].parentNode;", parent)
然后点击()。
我已经在 Java 中为您编写了完整的工作代码。我用过 chromedriver 版本 85.
我不应该粘贴整个代码,但我会为你做:)
我看到“下一个”按钮是第一个父按钮,因此您不需要递归。
PS: 自从我访问了意大利语网页后,请确保字符串“Next”和“Ask to Join”是正确的 char for char。如果需要,请更改它们。
import java.util.ArrayList;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
String email = "Your Google Email";
String pass = "Your Google Password";
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
ChromeOptions options = new ChromeOptions();
// You need this to stop the page from askin u for mic
options.addArguments("--use-fake-ui-for-media-stream");
WebDriver driver = new ChromeDriver(options);
//Login to Google
driver.get("https://accounts.google.com/login");
ArrayList<WebElement> emailinput = new ArrayList<WebElement>();
ArrayList<WebElement> spans = new ArrayList<WebElement>();
emailinput = (ArrayList<WebElement>) driver.findElements(By.tagName("input"));
//Get all spans in page
spans = (ArrayList<WebElement>) driver.findElements(By.tagName("span"));
for(int i = 0; i < emailinput.size(); i++) {
if(emailinput.get(i).getAttribute("type").equals("email")) { emailinput.get(i).sendKeys(email); break; }
}
for(int i = 0; i < spans.size(); i++) {
if(spans.get(i).getText().equals("Next")) {
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", spans.get(i)); parent.click(); break; }
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ArrayList<WebElement> passinput = (ArrayList<WebElement>) driver.findElements(By.tagName("input"));
for(int i = 0; i < passinput.size(); i++) {
if(passinput.get(i).getAttribute("type").equals("password")) { passinput.get(i).sendKeys(pass); break; }
}
spans = (ArrayList<WebElement>) driver.findElements(By.tagName("span"));
for(int i = 0; i < spans.size(); i++) {
if(spans.get(i).getText().equals("Next")) {
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", spans.get(i)); parent.click(); break; }
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Create a Meet room and put here its URL
driver.navigate().to("https://meet.google.com/dxz-dbwt-tpj");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
spans = (ArrayList<WebElement>) driver.findElements(By.tagName("span"));
for(int i = 0; i < spans.size(); i++) {
if(spans.get(i).getText().equals("Ask to Join")) {
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", spans.get(i)); parent.click(); break; }
}
}
}
对于进一步的自动化项目 - 避免在以编程方式生成值时通过 id 查找元素 - 它不会帮助你。此外,长 xpath 对您的项目性能不利。
定位器的性能级别是 -> ID,CSS,XPATH。
join_butt = WebDriverWait(浏览器,延迟,ignored_exceptions=ignored_exceptions).until(EC.presence_of_element_located((By.XPATH, '//跨度[包含(文本(),'Ask to join')]')))
稍后编辑
下次不要忽略异常 - 它会帮助您查看错误语法,我自己测试了以下代码。
join_butt = WebDriverWait(browser, delay).until(
EC.presence_of_element_located((By.XPATH, "//span[contains(text(),'Ask to join')]")))
driver.execute_script("arguments[0].click();", join_butt)
如果 chrome 浏览器不允许您登录 - 这是一个技巧
- 运行 你的代码
- 在该浏览器中转到 Whosebug
- 使用您的帐户登录
- 退出浏览器
- 运行 再次输入您的代码 - 现在您将自动登录到您的 google 帐户。
要打印文本 请求加入 你需要诱导 for the visibility_of_element_located()
and you can use the following :
使用 XPATH 和 get_attribute()
:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[text()='Ask to join']"))).get_attribute("innerHTML"))
使用 XPATH 和 text 属性:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[text()='Ask to join']"))).text)
You can find a relevant discussion in
要单击带有文本 要求加入 的元素,您需要诱导 for the element_to_be_clickable()
and you can use the following :
使用XPATH
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "//span[text()='Ask to join']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
结尾
Link 到有用的文档:
get_attribute()
方法Gets the given attribute or property of the element.
text
属性returnsThe text of the element.
- Difference between text and innerHTML using Selenium
我正在尝试在 google 会议 link 中单击请求加入按钮(使用我现有的 Google Chrome 个人资料)。这是代码:
options = webdriver.ChromeOptions()
options.add_argument(r"--user-data-dir=C:\Users\Pranil.DESKTOP-TLQKP4G.000\AppData\Local\Google\Chrome\User Data")
browser = webdriver.Chrome(ChromeDriverManager().install(), options=options)
delay = 15
browser.get('https://meet.google.com/tws-kcie-aox')
ignored_exceptions=(NoSuchElementException,StaleElementReferenceException,)
time.sleep(5)
join_butt = WebDriverWait(browser, delay ,ignored_exceptions=ignored_exceptions).until(EC.presence_of_element_located((By.XPATH, '//*[@id="yDmH0d"]/c-wiz/div/div/div[5]/div[3]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div')))
join_butt.click()
print(join_butt.text)#this prints Ask to join
但是没有点击加入按钮。按钮上最奇怪的部分 'Ask to join' 文本确实打印在最后一行。这意味着硒已到达正确的按钮。但是为什么还是不点击按钮呢?
编辑: 根据@Alin Stelian 的回答,我更新了代码如下:
browser.get('https://meet.google.com/hst-cfck-kee')
browser.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 'd')
join_butt = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.XPATH, "//span[contains(text(),'Ask to join')]")))
join_butt.click()
print(join_butt)
print(join_butt.text)
这确实有效,因为两个打印语句都有效...但是按钮没有被点击。这里出了什么问题?
You can use the quickest path
//span[contains(text(),'Ask to join')]
or from your code correct xpath
//*[@id="yDmH0d"]/c-wiz/div/div/div[4]/div[3]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div/span/span
your xpath in the Code
//*[@id="yDmH0d"]/c-wiz/div/div/div[5]/div[3]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div
在您不拥有的网站上使用 Selenium 时,从不 依赖 ID 或 类,因为它们经常更改,尤其是 google'网站。
搜索它的最佳方法是找到显示您知道写在按钮上的文本的元素(在本例中为请求加入),然后让所有父项循环并检查是否有一些它们是按钮。
像这样:
WebElement buttonTextElement = browser.find_elements_by_xpath("//*[contains(text(), 'Ask to join')]")
然后循环启动此 javascript 代码,仅当父角色属性等于“按钮”或标记为“按钮”时才停止它
WebElement parent = buttonTextElement;
WebElement parent = browser.execute_script("return arguments[0].parentNode;", parent)
然后点击()。
我已经在 Java 中为您编写了完整的工作代码。我用过 chromedriver 版本 85.
我不应该粘贴整个代码,但我会为你做:)
我看到“下一个”按钮是第一个父按钮,因此您不需要递归。 PS: 自从我访问了意大利语网页后,请确保字符串“Next”和“Ask to Join”是正确的 char for char。如果需要,请更改它们。
import java.util.ArrayList;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
String email = "Your Google Email";
String pass = "Your Google Password";
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
ChromeOptions options = new ChromeOptions();
// You need this to stop the page from askin u for mic
options.addArguments("--use-fake-ui-for-media-stream");
WebDriver driver = new ChromeDriver(options);
//Login to Google
driver.get("https://accounts.google.com/login");
ArrayList<WebElement> emailinput = new ArrayList<WebElement>();
ArrayList<WebElement> spans = new ArrayList<WebElement>();
emailinput = (ArrayList<WebElement>) driver.findElements(By.tagName("input"));
//Get all spans in page
spans = (ArrayList<WebElement>) driver.findElements(By.tagName("span"));
for(int i = 0; i < emailinput.size(); i++) {
if(emailinput.get(i).getAttribute("type").equals("email")) { emailinput.get(i).sendKeys(email); break; }
}
for(int i = 0; i < spans.size(); i++) {
if(spans.get(i).getText().equals("Next")) {
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", spans.get(i)); parent.click(); break; }
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ArrayList<WebElement> passinput = (ArrayList<WebElement>) driver.findElements(By.tagName("input"));
for(int i = 0; i < passinput.size(); i++) {
if(passinput.get(i).getAttribute("type").equals("password")) { passinput.get(i).sendKeys(pass); break; }
}
spans = (ArrayList<WebElement>) driver.findElements(By.tagName("span"));
for(int i = 0; i < spans.size(); i++) {
if(spans.get(i).getText().equals("Next")) {
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", spans.get(i)); parent.click(); break; }
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Create a Meet room and put here its URL
driver.navigate().to("https://meet.google.com/dxz-dbwt-tpj");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
spans = (ArrayList<WebElement>) driver.findElements(By.tagName("span"));
for(int i = 0; i < spans.size(); i++) {
if(spans.get(i).getText().equals("Ask to Join")) {
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", spans.get(i)); parent.click(); break; }
}
}
}
对于进一步的自动化项目 - 避免在以编程方式生成值时通过 id 查找元素 - 它不会帮助你。此外,长 xpath 对您的项目性能不利。
定位器的性能级别是 -> ID,CSS,XPATH。
join_butt = WebDriverWait(浏览器,延迟,ignored_exceptions=ignored_exceptions).until(EC.presence_of_element_located((By.XPATH, '//跨度[包含(文本(),'Ask to join')]')))
稍后编辑 下次不要忽略异常 - 它会帮助您查看错误语法,我自己测试了以下代码。
join_butt = WebDriverWait(browser, delay).until(
EC.presence_of_element_located((By.XPATH, "//span[contains(text(),'Ask to join')]")))
driver.execute_script("arguments[0].click();", join_butt)
如果 chrome 浏览器不允许您登录 - 这是一个技巧
- 运行 你的代码
- 在该浏览器中转到 Whosebug
- 使用您的帐户登录
- 退出浏览器
- 运行 再次输入您的代码 - 现在您将自动登录到您的 google 帐户。
要打印文本 请求加入 你需要诱导 visibility_of_element_located()
and you can use the following
使用 XPATH 和
get_attribute()
:print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[text()='Ask to join']"))).get_attribute("innerHTML"))
使用 XPATH 和 text 属性:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[text()='Ask to join']"))).text)
You can find a relevant discussion in
要单击带有文本 要求加入 的元素,您需要诱导 element_to_be_clickable()
and you can use the following
使用
XPATH
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "//span[text()='Ask to join']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
结尾
Link 到有用的文档:
get_attribute()
方法Gets the given attribute or property of the element.
text
属性returnsThe text of the element.
- Difference between text and innerHTML using Selenium